EXPR
を parse し、perl プログラムであるとみなして実行する。
現在の perl プログラムの環境で実行されるので、
変数、サブルーチン、フォーマット定義は後まで残る。
サブルーチンと同じく、評価した最後の expression の値が返る。
syntax error または runtime error があった場合、
または die
文が実行された場合、
eval
は undefined value を返し、
$@
にはエラーメッセージがセットされる。
エラーがなければ $@
はヌルであることが保証されている。
EXPR
が省略された場合は、$_
を評価する。
expression の最後にセミコロンがもしあれば、expression から除かれる。
See section $@ : 最後に行った eval のシンタックスエラーメッセージ for $@
.
eval
は致命的エラーをトラップするので、
ある機能(例えば dbmopen
や symlink
)が
インプリメントされているかどうかを決定するのに便利である。
また、eval
は、perl の例外トラップ機構(exception trapping mechanism)
でもある。この例外を起こすためには die
演算子を用いる。
実行するコードが変化しないのであれば、
eval-BLOCK
形式を使うことにより、
毎回コンパイルし直す不利益を被ることなく
実行時のエラーをトラップすることができる。
エラーは、もしあれば、同様に $@ にセットされる。
シングルクォートされた文字列(EXPR)を eval
するのも同様の効果があるが、
eval-EXPR
はシンタックスエラーを実行時に $@ に返すのに対し、
eval-BLOCK
はシンタックスエラーをコンパイル時に返す点が異なる。
eval-EXPR
形式は、
その実行が最初に成功した時点で eval-BLOCK
形式に最適化される。
(文字列置換において e
修飾子を用いた場合、
置換側はシングルクォートされた文字列であると見なされるので、
同様の最適化がこの場合にもなされる。)
例:
# 0 除算を致命的エラーにしない
eval { $answer = $a / $b; }; warn $@ if $@;
# 最初に使った後、同じものに最適化される
eval '$answer = $a / $b'; warn $@ if $@;
# コンパイル時エラー
eval { $answer = };
# 実行時エラー
eval '$answer ='; # $@ をセットする