5

Mastering Perlの「Error Handling and Reporting」の章に取り組んでいます。のperlvarのエントリには、のように書かれています。$@

最後の eval() 演算子からの Perl 構文エラー メッセージ。$@ が null 文字列の場合、最後の eval() は正しく解析および実行されています (ただし、呼び出した操作は通常の方法で失敗した可能性があります)。

今、いつevalが正しく実行されず$@、未定義の値が残るのか疑問に思っています。そのようなケースはありますか?

4

3 に答える 3

4

これを行う 1 つの方法を次に示します (ただし、読む前に座ってください。;))

$@ = 123;
eval q{
  $@ = 456;
  print ">>>$@<<<\n";
  goto SKIP;
};

SKIP:
print ">>>$@<<<\n";
于 2013-07-21T21:54:45.930 に答える
3

Try::Tiny ドキュメントの Background セクションには、どの$@ように破壊されるか、およびなぜ Try::Tiny が破壊を避けるために特別な注意を払い、真実evalをテストするのではなく、常に戻り値をテストするかについての情報が含まれています$@。ある時点で誰かが遭遇したため、それらはすべてそこにありますが、 eval-in-DESTROYシナリオは、誰かがつまずく可能性が最も高いシナリオだと思います. 基本的に、die一部のオブジェクトが範囲外になり、そのオブジェクトにDESTROYを呼び出す がある場合、最初に使用しevalた値dieは取り返しのつかないほど失われます。evalin がエラーをスローDESTROY しないと仮定すると、outer$@に従います。""eval

于 2013-07-21T20:32:58.043 に答える
1

$@undef に設定することについて誰が何か言いましたか?

「最後に解析され、正しく実行された eval()」は意味evalがありません。実行時に解析されません。確かに、それは「式が正しく解析および実行された最後の eval()」を意味します。言い換えれば、「式がコンパイルされ、実行時に例外がスローされなかった最後の eval()」です。

>perl -MData::Dumper -e"$@=123; eval ''; print(Dumper($@));"
$VAR1 = '';

>perl -MData::Dumper -e"$@=123; eval '~~~'; print(Dumper($@));"
$VAR1 = 'syntax error at (eval 1) line 2, at EOF
';

>perl -MData::Dumper -e"$@=123; eval 'die q{x}'; print(Dumper($@));"
$VAR1 = 'x at (eval 1) line 1.
';
于 2013-07-21T20:43:03.133 に答える