Perlのeval関数の使用例
Perlはリアルタイムにコードを生成して実行するスクリプト言語です。この機能により、コードのコンパイルが実行時に延期されるため、quot;ダイナミックコード"と呼ばれています。また、PerlはJavaやC++のような例外処理機構を備えています。今回は、Perlの動的コードと例外処理機構を実装している関数、evalについて説明します。もし間違いがあれば、遠慮なく議論・批判してください。
eval関数は、Perlのコードの一部を引数とするPerlの仮想マシンと考えることができます。eval 関数の使い方は 'perldoc -f eval' で知ることができます。
eval EXPR
EXPRは、例えば、以下のような表現です。
eval "print $a" ;
eval 'print $a' . ', $b' ;
eval 1 + 3 ;
eval 'print ' . '$a + $b, "\n"' ;
eval $command;#$command = 'print "hello Perl"'
eval $ARGV[0];
実行されると、Perl インタープリタはまず式の値を解析し、その式の値を Perl ステートメントとして現在の実行コンテキストに挿入します。つまり、新しく生成された文は eval 文自身と同じコンテキスト環境を持つことになります。このようにして、eval 文が実行されるたびに、式が解析されます。そのため,ループの中で eval EXPR が実行されると,式は何度も解析されることになります.このように eval を使うことで,Perl スクリプトはリアルタイムにコードを生成し,実行することができますので,動的コード (dynamic code) を実現することができます.
eval BLOCK
BLOCKは、次のようなコードのブロックです。
eval {print $a};
eval {$a = 1, $b = 2, $c = $a + $b};
最初のアプローチとは異なり、BLOCK は一度だけパースされ、その後、現在の eval 関数の実行コンテキストにその全体が挿入されます。パースによるパフォーマンス上の利点と、コンパイル時にコードの構文をチェックできることから、このアプローチは、前者のアプローチも可能ですが、Perlとしてコードの一部に例外捕捉機構を提供するためによく使用されます。
eval 引数プログラムは、ヘルプ名で "ミニプログラム" と呼ばれています。いずれの場合も、eval 関数の戻り値はミニプログラムの最後の文の値であり、戻り値文に遭遇した場合はサブルーチンと同じになります。
Script1:
#! /usr/bin/perl -w
push ( @program,'$i = 1;');
push ( @program,'$i = 3; $j = 2; $k = $i + $j');
push ( @program, '$i = 3; return 24; $k = $i + $j');
foreach $exp (@program)
{
$rtn =eval($exp);
print $rtn,"\n";
}
出力します。
1
5
24
アプレットがシンタックスエラー、ランタイムエラー、または die ステートメントを起こした場合、eval は undef を返します。エラーコードは$@に格納されます。
Script2:
#! /usr/bin/perl -w
push ( @program, '$i = 3; die "error message"; $k = $i + $j');
foreach $exp (@program)
{
$rtn =eval($exp);
if ( ! defined ( $rtn))
{
print "Exception: " , $@,"\n";
}
else
{
print $rtn,"\n";
}
} ;
出力します。
Exception: error message at (eval 1) line 1.
Script3です。
#! /usr/bin/perl -w
# a run-time error
eval '$answer =' ; # sets $@
warn $@ if$@;
出力します。
syntax error at (eval 1) line 2, at EOF
関連
-
Perlの文字列比較と整数比較の違いについて
-
Perlについて(Perl公式サイトの翻訳です。)
-
Perl5 のコードを Perl6 に移行するためのソリューション
-
Perl バッチクエリ ip 属性メソッドコード
-
長さを指定し、ランダムなDNA配列を生成するperlスクリプトコード
-
perlのour-my-localスコープ宣言の紹介
-
Perl で File::Lockfile を使用して、スクリプトの単一インスタンスを確保する
-
perlの尖ったブラケット演算子(<>)について
-
[解決済み] Perlで文字列の各単語の最初の文字を大文字にするにはどうすればよいですか?
-
[解決済み] Perlで環境変数を設定するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン