0

I need to be able to generate a conditional condition in the IF statement. The code should look something like this:

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

Which can be for example: column1 > 10 That obviously doesn't work. I tried doing this:

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

but it also doesn't work. Any ideas?

4

3 回答 3

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 /"; '

于 2012-09-25T11:25:18.847 回答
0

我不知道您使用的表达式不起作用..我在下面显示的代码对我来说很好..

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

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

} else {
    say "Not greater";
}
于 2012-09-25T11:23:13.343 回答
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()由于 amon 提到的安全问题和更清晰的代码,这被认为比 更好。

话虽这么说,eval()在许多情况下都很好。

于 2012-09-25T12:05:31.290 回答