Go to the first, previous, next, last section, table of contents.

eval

`eval(EXPR)'
`eval EXPR'
`eval BLOCK'
EXPR を parse し、perl プログラムであるとみなして実行する。 現在の perl プログラムの環境で実行されるので、 変数、サブルーチン、フォーマット定義は後まで残る。 サブルーチンと同じく、評価した最後の expression の値が返る。 syntax error または runtime error があった場合、 または die 文が実行された場合、 eval は undefined value を返し、 $@ にはエラーメッセージがセットされる。 エラーがなければ $@ はヌルであることが保証されている。 EXPR が省略された場合は、$_ を評価する。 expression の最後にセミコロンがもしあれば、expression から除かれる。 See section $@ : 最後に行った eval のシンタックスエラーメッセージ for $@. eval は致命的エラーをトラップするので、 ある機能(例えば dbmopensymlink)が インプリメントされているかどうかを決定するのに便利である。 また、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 =';	# $@ をセットする

Go to the first, previous, next, last section, table of contents.