2012-07-04 6 views
6

私は[email protected]がグローバル変数であるという事実を認識してんだ、まだ私は理解することはできません。

例えば:

eval { SOME_FUNC_THAT_MAY_DIE(); }; 
if ([email protected]) { 
    print "An error occured!\n"; 
} 

可能のみ私が考えることができることは、いくつかのシグナルハンドラが[email protected]を読み込もうとすると同時にdieと呼ぶ場合、私はここで何が間違っていますか?

答えて

12

理由は、あなたの発信者の[email protected]を踏んで回避することです。サブルーチンがグローバル変数を変更するのは失礼です(サブルーチンの目的の1つでない限り)。これは実際にはトップレベルコード(サブルーチン内ではない)の問題ではありません。

また、古いPerlの者に、オブジェクトの破壊時に呼び出されるevalを壊しうグローバル[email protected][email protected]が最初にローカライズされていない限り(例外はevalブロックから送出されていましたので、オブジェクトが破壊された場合)。これはfixed in 5.14.0でしたが、多くの人々はまだ古いPerlを実行しています。

9

Try::Tinyモジュールのドキュメントは、根拠を与える(だけでなく、代替を提供する):

あなたはevalのブロックを実行し、それが成功した場合、$ @を潜在的に現在中であるエラーを追い払ってくれる、クリアされます捕らえられた これは離れた場所でアクションを起こし、発信者がまだ処理していない可能性がある以前のエラーをクリアします。 この問題を回避するには、evalを呼び出す前に$ @を適切にローカライズする必要があります。 具体的には、$ @は評価の冒頭で詰まっており、死ぬ前に以前のエラーをキャプチャすることもできません(エラースタックを持つ例外オブジェクトを作成する場合など)。 evalを呼び出す前 local [email protected]を言うために
+0

私がこの記事を見つけたのは、Try:Tinyのドキュメントでこの段落を正確に理解できなかったからです。 「潜在的に現在捕らえられているエラーを壊す」とはどういう意味ですか? ;-) –

関連する問題