undef 値を参照するときに、単に警告するのではなく、Perl を停止してスタック トレースを表示するにはどうすればよいですか? use strict;
この目的には十分ではないようです。
6 に答える
use warnings FATAL => 'uninitialized';
use Carp ();
$SIG{__DIE__} = \&Carp::confess;
最初の行は警告を致命的にします。次の 2 つは、プログラムが終了したときにスタック トレースを引き起こします。
%SIG
他の人が提案した面倒なことをいじる代わりに、ただやるだけです。use Carp::Always
で実行するだけで、ソースを変更せずにモジュールをスクリプトに挿入できることに注意してくださいperl -MCarp::Always
。さらに、PERL5OPT
環境変数をに設定-MCarp::Always
して、スクリプトの呼び出しを変更することなくロードすることができます。( を参照してくださいperldoc perlrun
。)
これを含めます:
use Carp ();
次に、ソース ファイルの先頭に次のいずれかの行を含めます。
local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;
行はconfess
スタック トレースを提供し、cluck
行はより簡潔になります。
undef 値を参照すること自体は問題になりませんが、コードがそれを undef 以外のものと想定している場合は、警告が発生する可能性があります。(特に、その変数をオブジェクト参照として使用しようとしている場合)。次のようなものをコードに入れることができます。
use Carp qw();
[....]
Carp::confess '$variableName is undef' unless defined $variableName;
[....]
これらの警告を致命的にする 1 つの方法は、WARN仮想シグナルのシグナル ハンドラーをインストールすることです。
$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ };
これは手動で行う必要があります。上記の「答え」は機能しません!これをテストしてください:
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 の無効な参照としての使用を自動的に検出させる方法を私は知りません。自動有効化がシームレスに機能するように、これは設計によるものだと思います。