最新の「新着記事」はここから New!
2010-03-12
eval関数 - 「例外のキャッチ」と「文字列の実行」
引数として文字列を受け取るevalについて解説します。evalに文字列を渡すとその文字列をPerlの実行文として実行します。実行時に発生したエラーは$@に格納されます。
# 文字列をPerlの実行文として実行 eval $str;
evalは原則として使用してはいけません。evalが最後の手段である場合にのみ使用します。ほとんどの場合にevalを使用しない方法が存在しますのでevalしたくなってもevalしないでください。たとえばクロージャを使って実現できるかもしれません。
evalは文字列を解析しますのでパフォーマンスはよくありません。また渡された文字列をそのまま実行してしまうのでセキュリティという観点で見ても望ましくありません。
どうしてもevalするしかない場合の例としては動的にモジュールを読み込む場合があります。equireやuseは引数に裸の文字列しか受け取ることができないのでevalせざるをえません。必ず危険な文字列でないことを確認してからevalを実行します。
my $module = shift; # 危険な文字列でないことを確認 die "Invalid module name \"$module\"" if $module =~ /[^\w:]/; # モジュールの読み込み eval "require $module"; # エラーチェック die "Fail loading module \"$module\"" if $@;


