私はTerm :: ReadLine :: Gnuを使用しており、シグナルハンドリングの問題が発生しています。以下のスクリプトとTERMシグナルがスクリプトに送られた場合、 Enterキーが押された後にまでTERMシグナルのハンドラはトリガされません。 Term :: ReadLineを使う:これは発生しません。Perl Term :: ReadLine :: Gnuシグナルハンドリングの問題
私はTerm :: ReadLine :: Gnuには独自の内部シグナルハンドラがありますが、正直言って私はそれらを扱う方法を失っています。
http://search.cpan.org/~hayashi/Term-ReadLine-Gnu-1.20/Gnu.pm#Term::ReadLine::Gnu_Variablesは、rl_catch_signals変数を0に設定しようとしましたが、役に立たなかったことを確認しました。理想的には、私はGnuシグナルハンドラを使って作業したいと思いますが、私もそれらを無効にするために解決します。
具体的には、入力キーが押されるのを待つのではなく、信号が受信された後にトリガーするTERMハンドラが必要です。
ご迷惑をおかけして申し訳ございません。
#!/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";
}
}
これはバッファリングの問題ではないかと思います。この回答から解決策を試してください:http://stackoverflow.com/a/7603502/1791055 – titanofold
'/ \ S || \ n /'は何をすべきですか?あなたの2つのパイプの間に何もないので、正規表現はどんなものとも一致するので、!〜は常に偽になることに注意してください。 – Tanktalus
ysthは別の投稿でこの質問に答えるのを手伝ってくれましたhttp://stackoverflow.com/questions/13332908/termreadline-i-need-to-hit-the-up-arrow-twice-to-retrieve-history T:R:Gはデフォルトで追加ヒストリを行います。私はそれを削除します。 –