15

undef 値を参照するときに、単に警告するのではなく、Perl を停止してスタック トレースを表示するにはどうすればよいですか? use strict;この目的には十分ではないようです。

4

6 に答える 6

20
use warnings FATAL => 'uninitialized';

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

最初の行は警告を致命的にします。次の 2 つは、プログラムが終了したときにスタック トレースを引き起こします。

于 2008-09-16T22:32:25.853 に答える
15

%SIG他の人が提案した面倒なことをいじる代わりに、ただやるだけです。use Carp::Always

で実行するだけで、ソースを変更せずにモジュールをスクリプトに挿入できることに注意してくださいperl -MCarp::Always。さらに、PERL5OPT環境変数をに設定-MCarp::Alwaysして、スクリプトの呼び出しを変更することなくロードすることができます。( を参照してくださいperldoc perlrun。)

于 2008-09-16T23:11:35.137 に答える
4

これを含めます:

use Carp ();

次に、ソース ファイルの先頭に次のいずれかの行を含めます。

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

行はconfessスタック トレースを提供し、cluck行はより簡潔になります。

于 2008-09-16T22:32:04.047 に答える
1

undef 値を参照すること自体は問題になりませんが、コードがそれを undef 以外のものと想定している場合は、警告が発生する可能性があります。(特に、その変数をオブジェクト参照として使用しようとしている場合)。次のようなものをコードに入れることができます。

use Carp qw();

[....]

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

[....]
于 2008-09-16T22:32:31.893 に答える
1

これらの警告を致命的にする 1 つの方法は、WARN仮想シグナルのシグナル ハンドラーをインストールすることです。

$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ };
于 2008-09-16T22:33:12.937 に答える
0

これは手動で行う必要があります。上記の「答え」は機能しません!これをテストしてください:

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 の無効な参照としての使用を自動的に検出させる方法を私は知りません。自動有効化がシームレスに機能するように、これは設計によるものだと思います。

于 2011-05-03T17:10:31.193 に答える