undef 値を参照するときに Perl を停止するにはどうすればよいでしょうか?
質問
undef 値を参照したときに、単に警告するのではなく、Perl を停止してスタック トレースを表示するにはどうすればよいでしょうか?のようだ use strict;
この目的には十分ではありません。
解決
use warnings FATAL => 'uninitialized';
use Carp ();
$SIG{__DIE__} = \&Carp::confess;
最初の行は警告を致命的とします。次の 2 つは、プログラムが終了したときにスタック トレースを引き起こします。
他のヒント
面倒なことをする代わりに %SIG
他の人が提案しただけですが、 use カープ::いつも
そして完了します。
ソースを変更せずにスクリプトを実行するだけでモジュールをスクリプトに挿入できることに注意してください。 perl -MCarp::Always
;さらに、 PERL5OPT
環境変数を -MCarp::Always
スクリプトの呼び出しを変更せずにロードすることができます。(見る perldoc perlrun
.)
これを含めます:
use Carp ();
次に、含めます 1つ ソース ファイルの先頭にある次の行:
local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;
の confess
この行はスタック トレースを示し、 cluck
ラインはもっと簡潔です。
これらの警告を致命的なものにする 1 つの方法は、 警告 仮想信号:
$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 の使用を無効な参照として自動的に検出させる方法はわかりません。これは設計によるもので、自動復活がシームレスに機能するのではないかと思います。