如果生成警告,如何使Perl死掉?

Dav*_*d B 12 perl warnings die

我希望我的脚本perl在生成警告时死亡,包括由使用过的包生成的警告.

例如,这应该死:

use strict;
use warnings;
use Statistics::Descriptive;

my @data = ( 8, 9, 10, "bbb" );
my $stat = Statistics::Descriptive::Full->new();
$stat->add_data(@data);
Run Code Online (Sandbox Code Playgroud)

use warnings FATAL => 'all';不会有帮助,因为它是词法范围的.测试:: NoWarnings也不起作用,因为它不会杀死脚本.

raf*_*afl 17

我相信你正在寻找$SIG{__WARN__}记录在案的内容perlvar.类似的东西

$SIG{__WARN__} = sub { die @_ };
Run Code Online (Sandbox Code Playgroud)

可能是你想要的.


Eth*_*her 9

要添加到rafl的答案:在添加处理程序时%SIG,(通常)最好不要覆盖任何以前的处理程序,但在执行代码后调用它:

my $old_warn_handler = $SIG{__WARN__};
$SIG{__WARN__} = sub {

    # DO YOUR WORST...

    $old_warn_handler->(@_) if $old_warn_handler;
};
Run Code Online (Sandbox Code Playgroud)

(这也适用于像$SIG{HUP},$SIG{USR1}等等的信号处理程序.你永远不知道是否有其他包(或者甚至是"你"的另一个实例)已经设置了仍然需要运行的处理程序.)