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”的情况不完全相同。我发现“$@”在我的例子中是不确定的,所以当我试图检查异常的输出时,它总是会消失。我猜在我的上下文中(一些超级类或其他东西)同时抛出一些输出,以使“$@”不确定。