Perl:while中的eval计时器

Perl:while中的eval计时器,perl,alarm,Perl,Alarm,我尝试实现一个带有几个循环的计时器,如下所示 while ( $try < 3) { eval { local $SIG{ALRM} = {}; alarm 3; $ret = # sending request and wait for response alarm 0; } last if defined($ret); $try++; } while($try 打印“循环$\n”; 评估{

我尝试实现一个带有几个循环的计时器,如下所示

while ( $try < 3) {
    eval {
        local $SIG{ALRM} = {};
        alarm 3;
        $ret = # sending request and wait for response
        alarm 0;
    }
    last if defined($ret);
    $try++;
}
while($try<3){
评估{
本地$SIG{ALRM}={};
警报3;
$ret=#发送请求并等待响应
报警0;
}
最后一个(如果定义)($ret);
$try++;
}
但实际上,当警报过期时,整个“while”循环被中断,循环根本没有发生


我哪里搞错了?

您需要设置ALRM处理程序,就像文档中演示的那样:

for (1..3) {    
    print "Loop $_\n";

    eval {
        local $SIG{ALRM} = sub { die "alarm\n" };
        alarm 5;

        my $count = int rand 10;
        print "Is $count < 5?\n"; 
        sleep $count;

        alarm 0; #cancel the alarm if does not hang
    };

    if ($@) {
        die unless $@ eq "alarm\n";   # propagate unexpected errors
    } else {
        print "Our code succeeded\n";
        last;
    }
}
(1..3){code> 打印“循环$\n”; 评估{ 本地$SIG{ALRM}=sub{die“alarm\n”}; 警报5; 我的$count=整数兰特10; 打印“是否$count小于5?\n”; 睡眠$计数; 报警0;#如果未挂起,则取消报警 }; 如果($@){ 死亡,除非$@eq“报警”\n;#传播意外错误 }否则{ 打印“我们的代码成功\n”; 最后; } }
我第一次编写了一个处理程序,但看起来也不起作用。我会再试一次。我演示的应该很好用。甚至可以将其复制/粘贴到脚本中进行确认,然后再尝试将其集成到代码中。是的,谢谢。我使用了“超时”而不是“报警”。更改为“报警\n”后,一切正常。谢谢因此,对于我的哑巴来说,“报警\n”看起来相当固定。恩,与“报警\n”的情况不完全相同。我发现“$@”在我的例子中是不确定的,所以当我试图检查异常的输出时,它总是会消失。我猜在我的上下文中(一些超级类或其他东西)同时抛出一些输出,以使“$@”不确定。