use*_*860 1 perl loops signals
有没有人可以解释为什么下一个脚本不起作用?Label not found for "last SOME_BLOCK"错误的原因是什么?
#!/usr/bin/perl
use v5.14;
SOME_BLOCK: {
alarm 1;
$SIG{ALRM} = sub {
last SOME_BLOCK;
};
my $count = 0;
while (1) {
$count += 1;
say $count;
}
};
Run Code Online (Sandbox Code Playgroud)
根据perldoc退出子程序last或next禁止子程序(通常会触发警告).这是因为它非常混乱 - Perl需要动态搜索范围以找到您试图跳过的块,并从各种函数调用return(但应该使用什么返回值?).通常更安全.return
在信号处理上下文中,它更加混乱,因为Perl实际上必须暂停脚本的执行才能执行信号处理程序.因此它现在运行两个独立的执行上下文,并且信号处理程序上下文不能直接影响主上下文的控制流,这就是您得到该错误的原因.
你可以做两件事:
die)并在外部块中捕获它.这是不可取的,因为它可能会中断任何事情.$caught_signal = 1),并在方便的位置检查内部代码中的那个.