Perlがこの例外をキャッチしないのはなぜですか?
my $fh;
eval { close $fh };
warn('Caught') if &@;
出力:
Can't use an undefined value as a symbol reference at New_test.pl line 30.
更新:警告行のない同じ出力で、eval { close $fh };
30行目です。
Perlがこの例外をキャッチしないのはなぜですか?
my $fh;
eval { close $fh };
warn('Caught') if &@;
出力:
Can't use an undefined value as a symbol reference at New_test.pl line 30.
更新:警告行のない同じ出力で、eval { close $fh };
30行目です。
例外はevalにありません、その下の行&@
は間違ったシーケンスです、あなたは意味しました$@
UPD:strictをオンにすると、 closeが死ぬ可能性があり、$ fhがundefであることに注意してください。これは、通常のケースではないと思います(アルゴリズムのバグ)。
おそらくあなたは意味し、そうでは$@
ありません&@
か?後者はサブルーチンとして解釈されます。
を使用する必要が$@
あり&@
ます。Perlが持つすべての特別な変数を確認するには、このリンクを参照してください。
$@
最後のeval、do-FILE、またはrequireコマンドからのPerl構文エラーまたはルーチンエラーメッセージを意味します。設定されている場合、コンパイルが失敗したか、evalのコード内でdie関数が実行されました。
evalブロックは例外をキャッチし、致命的となるのを防ぎます。
例えば:
#!/usr/bin/perl -Tw
use strict;
use warnings;
my $fh;
close $fh;
print "done\n";
このプログラムは、closeが実行されると、予期されたメッセージで終了します。比較のために:
#!/usr/bin/perl -Tw
use strict;
use warnings;
my $fh;
eval { close $fh; };
print "done\n";
このプログラムは静かに実行され、最後にprintステートメントを実行します。