2010-10-09 82 views
11

我希望我的腳本Perl會在生成警告時死掉,包括使用包生成的警告。如果產生警告,我該如何讓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也不會完成這項工作,因爲它不會殺死腳本。

回答

9

爲了增加RAFL的回答是:添加一個處理程序%SIG時,它(通常)最好不要覆蓋任何以前的處理程序,但在執行你的代碼之後調用它:

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

    # DO YOUR WORST... 

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

(這也適用於信號處理像$SIG{HUP}$SIG{USR1},等你 永遠不知道其它的什麼包(或「你」,甚至另一個實例)已經 建立仍然需要運行一個處理程序。)

+0

這是更好的方法...就像C一樣,信號需要協作和級聯,否則你將在遠處修改具有單個值的全局處理程序時發生意外操作。 – dawg 2010-10-11 18:06:04

16

我相信你正在尋找$SIG{__WARN__},如perlvar所述。類似於

$SIG{__WARN__} = sub { die @_ }; 

可能是你想要的。

+1

但請注意,你改變一個全球性的,可能會看到意想不到的後果。審計用於修改'$ SIG {__ WARN __}'的包可能是一個好主意。 – darch 2010-10-09 18:02:04

相關問題