【发布时间】:2015-12-17 12:46:13
【问题描述】:
所以我一直在这里以及 perl.org 和 perlmaven.com 上四处寻找,但我对正在尝试运行的代码发生的事情感到困惑。我用谷歌搜索了 $SIG 是什么,并在 here 上找到了一些东西,这让我对 local $SIG 是什么有了一些了解,但我仍然对他的意思感到困惑:
Perl 有一个称为 %SIG 的内置散列,其中的键是操作系统中可用信号的名称。这些值是子程序(更具体地说是对子程序的引用),将在特定信号到达时调用。
除了操作系统的标准信号之外,Perl 还添加了两个内部“信号”。其中之一称为 WARN 并且在每次某些代码调用 warn() 函数时触发。另一种叫做DIE,在调用die()时触发。
它还在here 上说我不应该在警报呼叫中混用睡眠呼叫,但在那里解释的内容对我来说似乎是另一种语言。 我很困惑。我无法退出子程序而不会死在我身上。我正在运行的代码是这个(我从这里的另一篇文章中获得它,但我不想恢复那个帖子是从 2011 年开始的):
sub checkfind {
didfindchange;
while ($call_counter <= 20) {
my $previous_call_finished = 0;
eval {
local $SIG{ALRM} = sub { die "Alarm.\n" };
alarm 15;
if ($did_find_change eq "false") {
didfindchange;
print("Original FIND value: $original_find_value\n");
print("FIND value: $ems_find_value\n");
}
elsif ($did_find_change eq "true") {
print("FIND changed.\n");
print("Original FIND value: $original_find_value\n");
print("FIND value: $ems_find_value\n");
$previous_call_finished = 1;
}
sleep;
};
#Propagate unexpected errors.
die unless $@ eq "Alarm.\n";
warn "Timed out!\n" unless $previous_call_finished
}
return;
}
我的程序一直死机,我不确定原因。任何帮助,将不胜感激。谢谢!
【问题讨论】:
-
你为什么要睡觉?就此而言,请用英语描述您正在尝试做的事情
-
我想每 15 秒调用一次 didfindchange() 。如果 FIND 值改变,退出子程序。如果 FIND 值没有改变,五分钟后退出子程序。我调用 sleep() 是因为由于某种原因,如果我不这样做,子程序就会死掉。 @ysth