Как я могу заставить Perl умереть, если возникло предупреждение?
Я хочу, чтобы мой script 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 также не выполняет работу, так как не убивает script.
Ответы
Ответ 1
Чтобы добавить к 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}
и т.д. Вы
никогда не знаю, есть ли еще какой-то другой пакет (или даже другой экземпляр "ты" )
настройте обработчик, который еще нужно запустить.)
Ответ 2
Я считаю, что вы ищете $SIG{__WARN__}
, как описано в perlvar
. Что-то похожее на
$SIG{__WARN__} = sub { die @_ };
может быть тем, что вы хотите.