我需要能夠在IF語句中生成條件條件。 代碼應該是這個樣子:在Perl中評估IF語句的條件
if($filter_by $operator $value) {
# do something
}
這對於例如:列1> 10 這顯然是行不通的。 我試過這樣做:
if(eval "$filter_by $operator $value")
但它也行不通。 任何想法?
我需要能夠在IF語句中生成條件條件。 代碼應該是這個樣子:在Perl中評估IF語句的條件
if($filter_by $operator $value) {
# do something
}
這對於例如:列1> 10 這顯然是行不通的。 我試過這樣做:
if(eval "$filter_by $operator $value")
但它也行不通。 任何想法?
我不知道你使用的是什麼表情,不工作..正如我在下面的代碼工作正常,我..
#!/perl/bin
use v5.14;
use warnings;
my $column = 12;
if ($column > 10) {
say "Greater";
} else {
say "Not greater";
}
OP希望操作員是動態的。他希望在變量中有'>'。 – simbabque
@simbabque好的..我沒有得到很好的問題.. –
的eval
功能需要一個字符串,評估串作爲Perl代碼在當前上下文中並返回結果。
直接插補值是行不通的:
$arg1 = "ab cd";
$arg2 = "123";
$op = "==";
$result = eval "$arg1 $op $arg2";
將字符串傳遞ab cd == 123
到eval
,這是不是有效的Perl代碼。
然而,有一個簡單的解決方案爲eval
「d代碼可以看到外面的變量:
$result = eval('$arg1 ' . $op . ' $arg2');
參數名沒有得到插值,可以構造任意代碼。
注意,這可能是一個BadIdea(TM),因爲你可以在運營商引入惡意代碼:$op = '; system "rm -rf /"; '
你測試了最後一點? :P – simbabque
「正確」的方法是使用函數引用:
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()
在很多情況下都是完美的。
有人在一個月前問了一個類似的問題... – Zaid
你想評估什麼樣的表達?你可以在你使用它的地方顯示你的代碼嗎? –