如果生成警告,我怎样才能让 Perl 死掉?

Posted

技术标签:

【中文标题】如果生成警告,我怎样才能让 Perl 死掉?【英文标题】:How can I make Perl die if a warning is generated? 【发布时间】:2011-04-23 04:51:54 【问题描述】:

我希望我的脚本 perl 在生成警告时终止,包括由使用过的软件包生成的警告。

例如,这应该死:

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

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

use warnings FATAL => 'all'; 无济于事,因为它是词法范围的。 Test::NoWarnings 也不会做这项工作,因为它不会杀死脚本。

【问题讨论】:

【参考方案1】:

我相信您正在寻找$SIG__WARN__,如perlvar 中所述。类似于

$SIG__WARN__ = sub  die @_ ;

可能是你想要的。

【讨论】:

但请注意,您正在更改全局并且可能会看到意想不到的后果。审核您用于修改 $SIG__WARN__ 的软件包可能是个好主意。【参考方案2】:

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

my $old_warn_handler = $SIG__WARN__;
$SIG__WARN__ = sub 

    # DO YOUR WORST...

    $old_warn_handler->(@_) if $old_warn_handler;
;

(这也适用于$SIGHUP$SIGUSR1 等信号处理程序。你 永远不知道是否已经有其他包(甚至是“你”的另一个实例) 设置一个仍需要运行的处理程序。)

【讨论】:

这是更好的方法...就像 C 一样,信号需要协作和级联,否则您将在远处使用单个值修改全局处理程序的意外操作。

以上是关于如果生成警告,我怎样才能让 Perl 死掉?的主要内容,如果未能解决你的问题,请参考以下文章

Perl 的模板工具包可以警告未定义的值吗?

可以“使用严格”警告而不是错误

如果没有错误,我怎么才能显示警告?

加载 gdata 包时如何修复 Perl 警告消息?

在 Perl 中抑制无法定位模块警告

使用 utf8 时不输出 Perl 警告、严格和诊断错误