如果生成警告,我怎样才能让 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 死掉?的主要内容,如果未能解决你的问题,请参考以下文章