Perl:CRTL C在调用子例程而不是退出时被忽略

Perl:CRTL C在调用子例程而不是退出时被忽略,perl,Perl,所以脚本是这样的: use strict; use warnings; use Term::ReadLine; $SIG{'INT'} = 'INT_handler'; sub INT_handler { print "[+] Abording\n"; home(); } my $term = Term::ReadLine->new('Simple Perl calc'); sub home { my $prompt = "\$> "; my $OUT = $

所以脚本是这样的:

use strict;
use warnings;
use Term::ReadLine;

$SIG{'INT'} = 'INT_handler';
sub INT_handler {
  print "[+] Abording\n";
  home();
}

my $term = Term::ReadLine->new('Simple Perl calc');

sub home {

  my $prompt = "\$> ";
  my $OUT = $term->OUT || \*STDOUT;

  while ( defined ($_ = $term->readline($prompt)) ) {
    my $com = $_;
    print $com."\n";
    if ($com eq 'exit') {
        exit;
    }
  option(); # another subroutine when the input is transferred to
  }
}

home();
我得到的是:

$>                                                                              
[+] Abording
$> # I pushed CRTL C but nothing shows                                                                             
$> # same here
我想要实现的是能够在不退出的情况下转到
home()
,并保持
$SIG{'INT'}
工作


我尝试了一些其他方法(标签,使用if语句),但这将花费太长时间,因为输入用于长进程

您不应该在信号处理程序中调用
home()

只需设置一个在输入循环中检查的标志。当
$term->readline()
返回时,因为它被CTRL-C中断,请检查标志是否已设置,重置它并继续循环

以下是您的更新代码:

#/usr/bin/perl
严格使用;
使用警告;
使用Term::ReadLine;
$SIG{'INT'}='INT_handler';
我的美元被打断了;
子整数处理器{
$1++;
}
my$term=term::ReadLine->new('Simple Perl calc');
次级住宅{
my$prompt=“\$>”;
my$OUT=$term->OUT | STDOUT;
while(已定义($|=$term->readline($prompt))| |$中断){
如果($中断){
美元=0;
打印“\n[+]正在中止\n”;
下一个
}
my$com=$\;
打印$com。“\n”;
如果($com eq‘退出’){
出口
}
}
}
home();
出口0;
测试输出:

$perl dummy.pl
$>测试
测试
$>^C
[+]中止
$>^C
[+]中止
$>sdasd^C
[+]中止
$>退出
出口

注意:似乎还有一个问题:您需要按return返回提示。可能与
Term::Readline
的工作方式有关。

当您的代码已经在
home
中时,为什么要从信号处理程序调用
home
,因为您从未退出它?啊!输入之后,我需要调用另一个子例程,其中一些过程需要一些时间,因此我想返回到
home()
,在这种情况下+1,好问题,但请将每个句子的第一个字母大写。此外,在英语中,通常使用逗号,就像您正在阅读的注释一样,后面有空格,但前面没有。是的,它确实有效,但假设我有双循环,我的意思是在输入后,我要循环字符串,需要我标记它吗?我想只要您不调用
$term->readline()
(或执行其他i/O操作)在再次进入外循环之前,您应该没事。