1

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行目です。

4

4 に答える 4

6

例外はevalにありません、その下の行&@は間違ったシーケンスです、あなたは意味しました$@

UPD:strictをオンにすると、 close死ぬ可能性があり、$ fhがundefであることに注意してください。これは、通常のケースではないと思います(アルゴリズムのバグ)。

于 2012-11-15T18:55:45.260 に答える
4

おそらくあなたは意味し、そうでは$@ありません&@か?後者はサブルーチンとして解釈されます。

于 2012-11-15T18:56:01.513 に答える
0

を使用する必要が$@あり&@ます。Perlが持つすべての特別な変数を確認するには、このリンクを参照してください。

$@最後のeval、do-FILE、またはrequireコマンドからのPerl構文エラーまたはルーチンエラーメッセージを意味します。設定されている場合、コンパイルが失敗したか、evalのコード内でdie関数が実行されました。

于 2012-11-15T19:55:39.910 に答える
0

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ステートメントを実行します。

于 2012-11-17T04:23:08.093 に答える