2010-10-09 11 views
11

Chciałbym, aby mój skrypt perl ginął za każdym razem, gdy generowane jest ostrzeżenie, w tym ostrzeżenia generowane przez używane pakiety.Jak sprawić, by Perl umarł, jeśli zostanie wygenerowane ostrzeżenie?

Na przykład ten powinien umrzeć

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'; nie pomoże ponieważ jest zawężona leksykalnie. Test::NoWarnings również nie wykonuje pracy, ponieważ nie zabija skryptu.

Odpowiedz

9

Aby dodać do rafl na odpowiedź: podczas dodawania obsługi do %SIG, to jest (zazwyczaj) lepiej nie nadpisać poprzednią obsługi, ale nazywają go po wykonaniu kodu:

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

    # DO YOUR WORST... 

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

(Odnosi się to również do Wózki sygnałowe jak $SIG{HUP}, $SIG{USR1} itp Państwo nigdy nie wiem, czy jakiś inny pakiet (lub nawet inny przykład „ty”) już założyć obsługi, który nadal potrzebuje do uruchomienia.)

+0

To jest lepsze podejście ... Podobnie jak w C, sygnały muszą współpracować i kaskadować, lub będziesz mieć niezamierzone działania na odległość modyfikując globalne programy obsługi z jedną wartością. – dawg

16

Wierzę, że szukasz $SIG{__WARN__} zgodnie z dokumentacją pod numerem perlvar. Coś podobnego do tego, co jest podobne do tego, co chcesz.

+1

Należy jednak pamiętać, że jesteś zmieniając globalny i może zobaczyć niezamierzone konsekwencje. Dobrym pomysłem byłoby sprawdzenie pakietów używanych do modyfikacji '$ SIG {__ WARN __}'. – darch

Powiązane problemy