在Perl中计算IF语句的条件
我需要能够在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($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