Подтвердить что ты не робот

Как я могу заставить 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.

4b9b3361

Ответ 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 @_ };

может быть тем, что вы хотите.