2012-09-25 64 views
0

我需要能夠在IF語句中生成條件條件。 代碼應該是這個樣子:在Perl中評估IF語句的條件

if($filter_by $operator $value) { 
    # do something 
} 

這對於例如:列1> 10 這顯然是行不通的。 我試過這樣做:

if(eval "$filter_by $operator $value") 

但它也行不通。 任何想法?

+0

有人在一個月前問了一個類似的問題... – Zaid

+0

你想評估什麼樣的表達?你可以在你使用它的地方顯示你的代碼嗎? –

回答

0

我不知道你使用的是什麼表情,不工作..正如我在下面的代碼工作正常,我..

#!/perl/bin 
use v5.14; 
use warnings; 

my $column = 12; 
if ($column > 10) { 
    say "Greater"; 

} else { 
    say "Not greater"; 
} 
+0

OP希望操作員是動態的。他希望在變量中有'>'。 – simbabque

+0

@simbabque好的..我沒有得到很好的問題.. –

3

eval功能需要一個字符串,評估串作爲Perl代碼在當前上下文中並返回結果。

直接插補值是行不通的:

$arg1 = "ab cd"; 
$arg2 = "123"; 
$op = "=="; 

$result = eval "$arg1 $op $arg2"; 

將字符串傳遞ab cd == 123eval,這是不是有效的Perl代碼。

然而,有一個簡單的解決方案爲eval「d代碼可以看到外面的變量:

$result = eval('$arg1 ' . $op . ' $arg2'); 

參數名沒有得到插值,可以構造任意代碼。

注意,這可能是一個BadIdea(TM),因爲你可以在運營商引入惡意代碼:$op = '; system "rm -rf /"; '

+2

你測試了最後一點? :P – simbabque

0

「正確」的方法是使用函數引用:

my $compare = sub { return $_[0] > $_[1] }; 
if ($compare->(1,2)) { print "One is greater than two"} 

$compare = sub { return $_[0] < $_[1] }; 
if ($compare->(1,2)) { print "One is less than two"} 

這是考慮到比eval()更好的風格,這兩者都是因爲提到的安全問題和更清晰的代碼。

這就是說,eval()在很多情況下都是完美的。