Вы не должны вызывать home()
в вашем обработчике сигналов.
Просто установите флаг, который вы проверяете в своем цикле ввода.Когда возвращается $term->readline()
, потому что он был прерван CTRL-C, проверьте, был ли установлен флаг, сбросьте его и продолжайте цикл.
Вот ваш обновленный код:
#!/usr/bin/perl
use strict;
use warnings;
use Term::ReadLine;
$SIG{'INT'} = 'INT_handler';
my $interrupted;
sub INT_handler {
$interrupted++;
}
my $term = Term::ReadLine->new('Simple Perl calc');
sub home {
my $prompt = "\$> ";
my $OUT = $term->OUT || \*STDOUT;
while ( defined ($_ = $term->readline($prompt)) || $interrupted ) {
if ($interrupted) {
$interrupted = 0;
print "\n[+] Aborting\n";
next;
}
my $com = $_;
print $com."\n";
if ($com eq 'exit') {
exit;
}
}
}
home();
exit 0;
Результаты теста:
$ perl dummy.pl
$> test
test
$> ^C
[+] Aborting
$> ^C
[+] Aborting
$> sdasd^C
[+] Aborting
$> exit
exit
ПРИМЕЧАНИЕ: Кажется, что есть еще одна проблема: вам нужно нажать клавишу возврата, чтобы получить приглашение обратно.Возможно, это связано с тем, как Term::Readline
работает.