Term :: ReadLine :: Gnu kullanıyorum ve sinyal işleme ile ilgili bir sorun yaşadım. Aşağıdaki betik ve betiğe gönderilen bir TERM sinyali verildiğinde, TERM sinyalinin işleyicisi numaralı tuşa basıldıktan sonra 'a kadar tetiklenmez. Term :: ReadLine kullanarak: Perl bu olmaz.Perl Dönemleri :: ReadLine :: Gnu Sinyal İşleme Zorlukları
Term :: ReadLine :: Gnu'nun kendi dahili sinyal işleyicilerine sahip olduğunu okudum, ancak açıkçası onlarla nasıl çalışacağım konusunda bir kayıp yaşıyorum.
http://search.cpan.org/~hayashi/Term-ReadLine-Gnu-1.20/Gnu.pm#Term::ReadLine::Gnu_Variables, rl_catch_signals değişkenini 0 olarak ayarlamayı denedim, ancak bu yardımcı olmadı. İdeal olarak, Gnu sinyal işleyicileri ile çalışmak isterdim, ama ben de onları devre dışı bırakmaya razı olacağım.
Kesinlikle belirtmek gerekirse, enter tuşuna basılmasını beklemek yerine, sinyal alındıktan sonra tetiklemek için TERM işleyicisine ihtiyacım var.
Herhangi bir yardım veya tavsiye kesinlikle takdir edilmektedir!
#!/usr/bin/perl
use strict;
use warnings;
use Term::ReadLine;
$SIG{TERM} = sub { print "I got a TERM\n"; exit; };
my $term = Term::ReadLine->new('Term1');
$term->ornaments(0);
my $prompt = 'cmd> ';
while (defined (my $cmd = $term->readline($prompt))) {
$term->addhistory($cmd) if $cmd !~ /\S||\n/;
chomp($cmd);
if ($cmd =~ /^help$/) {
print "Help Menu\n";
}
else {
print "Nothing\n";
}
}
Bu bir arabellek sorunu olup olmadığını merak ediyorum. Bu yanıtı çözümden deneyin: http://stackoverflow.com/a/7603502/1791055 – titanofold
'/ \ S || \ n /' ne yapması gerekiyor? :-) (Senin asıl sorununla ilgili değil, sadece fark ettim.) İki borunun arasında hiçbir şey olmadığı için, regex'in herşeyle eşleşeceğine dikkat et, böylece her zaman yanlış olur. – Tanktalus
ysth, bu soruyu başka bir gönderide yanıtlamama yardımcı oldu http://stackoverflow.com/questions/13332908/termreadline-i-need-to-hit-the-up-arrow-twice-to-retrieve-history T: R: G, varsayılan olarak addhistory olarak gereksizdir. Onu çıkaracağım. –