3

我喜欢在后面跳while(1)。怎么做?检查一个特殊变量last是不行的,因为 while 表达式包含一个阻塞调用,所以如果检查表达式就太晚了。

#!/usr/bin/perl
use strict;
use warnings;
use feature qw( say );
use sigtrap 'handler', \&hup_handler, 'HUP';
my $counter = 0;
sub hup_handler { say 'HUP!!!'; $counter = 0; return; }
say 'It starts here';
while ( 1 ) {
    sleep( 1 ); # Blocking call is in reality within while expression.
    say ++$counter;
}
say 'It ends here';
4

1 回答 1

6

这应该可以通过在信号处理程序中抛出异常,也就是 die() 来实现。

所以尝试做这样的事情:

say 'It starts here';
eval {
    local $SIG{HUP} = sub { say 'HUP!!!'; $counter = 0; die "*bang*"; }

    while ( 1 ) {
        sleep( 1 ); # Blocking call is in reality within while expression.
        say ++$counter;
    }
}
say 'It ends here';

当然,任何提供看起来更正常的 try/catch 语法的模块都可以工作。

于 2012-09-26T13:04:32.490 回答