eval(evaluate)

evaleval

セキュリティ上のリスク

編集

eval get_data() 
data = get_data()
foo = eval(data)

 "delete_system_files()" delete_system_files() eval

適切な使用

編集

evaleval使

eval使PHP
$name = 'John Doe';
$greeting = 'Hello';
$template = '"$greeting,  $name! How can I help you today?"';
print eval("return $template;")

 "$name"  $name 

eval 使eval

eval使LISP

実装

編集

eval

eval使

実例

編集

JavaScript, ActionScript

編集

JavaScriptActionScriptにおいては、evalは式の評価器と文の実行器のハイブリッドのような存在である。evalは最後に評価された式の値を返し(JavaScriptとActionScriptではすべての文は式である)、最後のセミコロンは省くことができる。

式評価器としての例:

foo = 2;
alert(eval('foo + 2'));

文実行器としての例:

foo = 2;
eval('foo = foo + 2;alert(foo);');

JavaScripteval使AjaxJSONJSON.parse 

ActionScripteval使Flash8使String[1]

LISPevalevalLISPLISPeval (REPL) 使LISPLISPeval

Perlのevalは、文字列をプログラムとして解釈するほか、例外処理機構としても機能する。コードの塊をテストし、必要ならそれに関して警告することができる。例えば、除算において実行時エラーが発生すると$@で警告を出力することができる。

# 0による除算の例外を回避する
eval { $answer = $x / $y; };
warn $@ if $@;

PHPeval eval()  eval() return eval() 

echo使:
<?php
$foo = "Hello, world!\n";
eval('echo $foo;');
?>

値を返す例:

<?php
$foo = "Goodbye, world!\n";
echo eval('return $foo;');
?>

PostScript

編集

PostScriptexec1PostScript
 ((Hello World) =) cvx exec

は PostScript の式である (Hello World) =(文字列 Hello World をスタックからポップして画面に表示する)を実行可能な型を持つように変換し、そして実行する。

PostScriptでは run 演算子も似た機能を持つが、代わりにインタプリタそのものがファイル中のPostScriptの式を評価する。

Python

編集

Python eval exec 

eval :
>>> x = 1
>>> eval('x + 1')
2
>>> eval('x')
1

exec の例(対話モード):

>>> x = 1
>>> y = 1
>>> exec "x += 1; y -= 1"
>>> x
2
>>> y
0

ColdFusion

編集

ColdFusionevaluate 関数は文字列で与えられた式を実行時に評価することができる。

<cfset x = "int(1+1)">
<cfset y = Evaluate(x)>

これは読み込む変数をプログラム的に選択するときなどに、特に便利である。

<cfset x = Evaluate("queryname.#columnname#[rownumber]")>

Rubyには式を評価するコンテキストごとに3種類のevalが存在する。eval はその場またはProcやBindingオブジェクト、instance_eval はインスタンス、module_eval(別名はclass_eval)はモジュールかクラス、それぞれのコンテキストで評価を行う。なお、評価コンテキスト変更のためにinstance_evalmodule_evalを使う場合、文字列でなくブロックを引数とすることができる[2]

evalの例(メソッドfooのコンテキストで評価している):

def foo
  x = 1
  binding
end

eval('x + 1', foo) #=> 2

instance_evalmodule_eval の例:

class Bar
@@cvar = 10 #クラス変数
  def initialize
    @ivar = 5 #インスタンス変数
  end
end

bar = Bar.new
bar.instance_eval('@ivar') #=> 5
Bar.class_eval('@@cvar') #=> 10

脚注

編集
  1. ^ Adobe - Flash 8 LiveDocs
  2. ^ instance method BasicObject#instance_eval - Ruby1.9.3リファレンスマニュアル

外部リンク

編集