目次
- eval関数とは
- 使用例
eval関数とは
pythonで言うtry-expect, PHPで言うtry-catch
evalの中で走らせた処理と異なった例外処理が走った場合にエラー文を返すことができる
eval関数の中身=例外だった場合の処理が書いてるわけじゃないので理解には注意
文字列の動的実行にも使われるらしいが、今回は割愛させてください。
ちなみに
引用:Perlゼミ
eval文字列の危険性
普通のプログラミングでは、eval文字列を使わないことを推奨します。
evalは渡された文字列をそのまま実行してしまうのでセキュリティという観点で望ましくないです。業務でアプリケーションを作成する場合であれば、eval文字列は使う場面はまずありません。
らしいです。
使用例
eval {
die "これがエラー構文です";
};
if ($@) {
print "ERROR:$@";
};
#結果 "ERROR:これがエラー構文です"
die関数を使用して強制的にエラーにしています。
次に、定義していない変数を掛け算します
eval {
$num * 1;
};
if ($@) {
print "エラー:$@";
};
#結果 Global symbol "$num" requires explicit package name (did you forget to declare "my $num"?) at hello.pl line 70.
$@
に入っていないのか、普通のエラー構文になりました。どのエラーをキャッチしてくれるのか気になりますね。
dieを使用して事前にエラーを防ぐこともできる
sub sum {
my $num = shift;
if ($num !~ /^\d{1}$/) {
die '異常終了しました。';
}
my $sumsum = 5 + $num;
return print $sumsum . "\n";
};
eval {
sum("おかわり");
};
if ($@) {
print "エラー:$@";
};
#エラー:異常終了しました
ちなみにsum(~)
とかsum(お)
とかsum(o)
とかにしたら$@
に渡らずに普通のエラーになった。。
$@
で渡るエラー、渡らないエラーに何の違いがあると言うのか。。
ちなみに、ドキュメントを見た感じ構文エラーと実行エラーの発生、それとdie文が実行されると、って書いてある。意図しないシンタックスとかは構文エラーのカテゴリじゃないのか??
とにかく関数内で予想されそうな構文エラーとかを考慮したdie文書いておけば何とかなりそう??1人で勝手に考えてみた