Tôi đang sử dụng thuật ngữ :: ReadLine :: Gnu và đã gặp phải sự cố khi xử lý tín hiệu. Với kịch bản bên dưới và tín hiệu TERM được gửi tới tập lệnh, trình xử lý tín hiệu TERM không được kích hoạt cho đến khi sau phím enter được nhấn. Sử dụng thuật ngữ :: ReadLine: Perl điều này không xảy ra.Perl Term :: ReadLine :: Gnu Xử lý tín hiệu Khó khăn
Tôi đã đọc thuật ngữ đó :: ReadLine :: Gnu có bộ xử lý tín hiệu nội bộ riêng của nó, nhưng thẳng thắn tôi thua lỗ về cách làm việc với chúng.
Tôi đã xem xét http://search.cpan.org/~hayashi/Term-ReadLine-Gnu-1.20/Gnu.pm#Term::ReadLine::Gnu_Variables đã thử đặt biến rl_catch_signals thành 0, nhưng điều đó không giúp ích gì. Lý tưởng nhất, tôi muốn làm việc với các trình xử lý tín hiệu Gnu, nhưng tôi sẽ giải quyết cho việc vô hiệu hóa chúng.
Để hoàn toàn cụ thể, tôi cần trình xử lý TERM để kích hoạt sau khi nhận được tín hiệu thay vì đợi nhập phím.
Bất kỳ trợ giúp hoặc lời khuyên nào chắc chắn được đánh giá cao!
#!/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";
}
}
Tôi tự hỏi đây có phải là vấn đề về đệm hay không. Hãy thử giải pháp từ câu trả lời này: http://stackoverflow.com/a/7603502/1791055 – titanofold
'/ \ S || \ n /' phải làm gì? :-) (Không liên quan đến câu hỏi thực tế của bạn, tôi chỉ nhận thấy nó.) Lưu ý rằng bởi vì không có gì giữa hai ống của bạn, regex sẽ phù hợp với bất cứ điều gì, vì vậy! ~ Sẽ luôn luôn là sai. – Tanktalus
ysth đã giúp tôi trả lời câu hỏi này trong một bài đăng khác http://stackoverflow.com/questions/13332908/termreadline-i-need-to-hit-the-up-arrow-twice-to-retrieve-history Biến nó hoàn toàn thừa như T: R: G không có tính năng mặc định. Tôi sẽ loại bỏ nó. –