3

の後にジャンプするのが好きwhile(1)です。どうやってするか?while 式にブロッキング呼び出しが含まれているため、特別な変数をチェックしても問題ありません。そのため、式をチェックすると手遅れになります。last

#!/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 に答える