Как заставить Perl останавливаться при ссылке на значение undef?

StackOverflow https://stackoverflow.com/questions/77954

  •  09-06-2019
  •  | 
  •  

Вопрос

Как заставить Perl останавливаться и выдавать трассировку стека, когда вы ссылаетесь на значение undef, а не просто предупреждать?Кажется, что use strict; для этой цели недостаточно.

Это было полезно?

Решение

use warnings FATAL => 'uninitialized';

use Carp ();
$SIG{__DIE__} = \&Carp::confess;

Первая строка делает предупреждение фатальным.Следующие два вызывают трассировку стека, когда ваша программа умирает.

Другие советы

Вместо беспорядочной возни с %SIG предложено всеми остальными, просто use Карп::Всегда и дело сделано.

Обратите внимание, что вы можете вставлять модули в скрипт без изменения исходного кода, просто запустив его с помощью perl -MCarp::Always;кроме того, вы можете установить PERL5OPT переменная среды для -MCarp::Always чтобы он загружался, даже не меняя вызов скрипта.(Видеть perldoc perlrun.)

Включите это:

use Carp ();

Затем включите один из этих строк в верхней части исходного файла:

local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;

А confess строка даст трассировку стека, а cluck линия гораздо более краткая.

Один из способов сделать эти предупреждения фатальными — установить обработчик сигналов для ПРЕДУПРЕЖДАТЬ виртуальный-сигнал:

$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ };

Ссылка на значение undef сама по себе не будет проблемой, но может вызвать предупреждения, если ваш код ожидает, что это будет нечто иное, чем undef.(особенно если вы пытаетесь использовать эту переменную в качестве ссылки на объект).Вы можете поместить что-то в свой код, например:

use Carp qw();

[....]

Carp::confess '$variableName is undef' unless defined $variableName;

[....]

Вам следует сделать это вручную.Вышеуказанные «ответы» не работают!Просто проверьте это:

use strict;
use warnings FATAL => 'uninitialized';
use Carp ();
$SIG{__DIE__} = \&Carp::confess;

my $x = undef; # it would be enough to say my $x;
if (!$x->{test}) {
print "no warnings, no errors\n";
}

Вы увидите, что разыменование не вызвало каких-либо сообщений об ошибках или предупреждений.Я не знаю способа заставить Perl автоматически обнаруживать использование undef как недопустимую ссылку.Я подозреваю, что это так задумано, чтобы автовивификация работала без проблем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top