在Perl中计算IF语句的条件

在Perl中计算IF语句的条件,perl,if-statement,Perl,If Statement,我需要能够在IF语句中生成条件条件。 代码应该如下所示: if($filter_by $operator $value) { # do something } 例如:column1>10 这显然行不通。 我试着这样做: if(eval "$filter_by $operator $value") 但它也不起作用。 有什么想法吗?我不知道你用的是什么不起作用的表达方式。。下面我展示的代码对我来说很好 #!/perl/bin use v5.14; use warnings; my $co

我需要能够在IF语句中生成条件条件。 代码应该如下所示:

if($filter_by $operator $value) {
  # do something
}
例如:column1>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";
}

我不知道你在用什么不起作用的表达。。下面我展示的代码对我来说很好

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

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

} else {
    say "Not greater";
}

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');
参数名不会被插值,您可以构造任意代码


请注意,这可能是一个坏主意(TM),因为您可能会在操作符中引入恶意代码:
$op=”;系统“rm-rf/”;'

函数
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');
参数名不会被插值,您可以构造任意代码

请注意,这可能是一个坏主意(TM),因为您可能会在操作符中引入恶意代码:
$op=”;系统“rm-rf/”;'

正确的方法是使用子例程引用:

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"}
my$compare=sub{return$\[0]>$\[1]};
如果($compare->(1,2)){print“一大于二”}
$compare=sub{return$\[0]<$\[1]};
如果($compare->(1,2)){print“一小于二”}
这被认为是比
eval()
更好的样式,这既是因为amon提到的安全问题,也是为了更清晰的代码

也就是说,
eval()
在许多情况下都是完美的。

正确的方法是使用子例程引用:

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"}
my$compare=sub{return$\[0]>$\[1]};
如果($compare->(1,2)){print“一大于二”}
$compare=sub{return$\[0]<$\[1]};
如果($compare->(1,2)){print“一小于二”}
这被认为是比
eval()
更好的样式,这既是因为amon提到的安全问题,也是为了更清晰的代码


也就是说,
eval()
在很多情况下都是完美的。

大约一个月前有人问了一个类似的问题……你想计算哪种表达式??你能把你的代码显示在你使用它的地方吗?大约一个月前有人问了一个类似的问题…你想计算什么样的表达式??你能把你的代码显示在你使用它的地方吗?OP希望操作符是动态的。他希望变量中有
。OP希望运算符是动态的。他想在变量中加入
。你测试过最后一位了吗你测试过最后一点了吗P