2016-11-19 4 views
3

次のプログラムはevalへの2回目の呼び出しで停止します。それは期待されていますか?私はperldoc -f evalを読んで、印刷 "2:..."の出力が表示されないことに驚いています。ブロックなしでevalを呼び出すと、このPerlプログラムが終了するのはなぜですか?

eval {die("The curly braces seem to rescue me! Life moves on")}; 
print "1: [email protected]\n"; 
eval die("Program actually terminates here! Subsequent prints are not shown"); 
print "2: [email protected]\n"; 

答えて

5

perldoc -f eval

eval EXPR 
eval BLOCK 
eval In the first form, often referred to as a "string eval", the 
     return value of EXPR is parsed and executed as if it were a little 
     Perl program. 

...そうdieが呼び出された後、それが返す文字列が評価されます。

...文字列を返さない以外は、それはプログラムが死ぬようにしますevalは決して呼ばれません。

+0

クエンティン、ありがとう。私は、一般的には、致命的なエラーを捕捉することを含め、常にEXPRからの結果を得ると誤解していました。明らかに、それはstr evalの場合ではありません。 – Ltf4an

+0

私はperldoc -f evalから次の段落に気付きました: "構文エラーまたは実行時エラーがある、またはdie文が実行された場合、evalはスカラーコンテキストでundefを返し、リストコンテキストでは空のリストを返します..."なぜなら、eval()(strまたはblock)の後には常にプログラムを続けるべきだと示唆しているように見えるからです。私はここでも何かを誤解していますか? – Ltf4an

+1

@ Ltf4an - (1)式は通常通り実行されます(2)戻り値(文字列であることが期待されます)は 'eval'に渡されます。 (3) 'eval'はその文字列を評価します。あなたが引用したルールは、ステップ3で適用されます。 – Quentin

関連する問題