1

有人可以解释为什么下一个脚本不起作用吗?错误的原因是什么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;
    }
};
4

1 回答 1

6

根据perldoclast禁止通过or退出子例程(通常会触发警告)。这是因为它非常混乱 - Perl 需要动态搜索范围以找到您要跳过的块,并从各种函数调用 return(但应该使用什么返回值?)。一般比较安全。nextreturn

在信号处理上下文中,它更加混乱,因为 Perl 实际上必须暂停脚本的执行才能执行信号处理程序。所以它现在运行两个独立的执行上下文,信号处理程序上下文不能直接影响主上下文的控制流,这就是你得到那个错误的原因。

你可以做两件事:

  • 抛出异常(使用die)并在外部块中捕获它。这是不可取的,因为它几乎可以中断任何事情。
  • 设置一个在信号处理程序外部定义的全局标志,例如 ( $caught_signal = 1) 并在内部代码中方便的时候检查它。
于 2013-02-23T13:45:35.020 回答