我正在寻找一种在Perl中执行此操作的方法:
$a = "60"; $b = "< 80";
if ( $a $b ) { then .... }
Run Code Online (Sandbox Code Playgroud)
在这里,$b"拥有"一名操作员......我可以这样做吗?也许其他一些方式?
P S*_*ved 18
很高兴看到人们如何发现函数式编程.:-)
幸运的是,Perl具有即时创建和存储功能的能力.例如,您问题中的示例将如下所示:
$a = "60"; $b = sub { $_[0] < 80 };
if ( $b->($a) ) { .... }
Run Code Online (Sandbox Code Playgroud)
在这个例子中,对匿名子程序的引用存储在子程序中$b,该子程序具有与通常的参数传递相同的语法. ->然后用于引用调用(与可能用于引用数组和哈希的语法相同).
但是,当然,如果您只想从任意字符串构造Perl表达式,您可能希望使用eval:
$a = "60"; $b = " < 80";
if ( eval ("$a $b") ) { .... }
Run Code Online (Sandbox Code Playgroud)
但是,eval如果您正在评估的字符串包含作为用户输入的部分,则执行此操作并不安全. SinanÜnür 在他的回答评论中完美地解释了这一点.
如何定义包含所需条件的函数:
my $cond = sub { $_[0] < 80 };
if ( $cond->( $a ) ) {
...
}
Run Code Online (Sandbox Code Playgroud)
这应该是一个评论,但评论太像这样的东西,所以我做CW.
对于您显示将要传递给字符串eval的变量的内容的情况,接受的解决方案是正确的.
但是,如果内容$a和$b来自用户输入,那么请看下面的脚本:
#!/usr/bin/perl
use strict; use warnings;
my $x = '80';
my $y = '; warn "evil laugh!\n"; exit';
if ( eval ($x . $y) ) {
print "it worked!!!\n";
}
Run Code Online (Sandbox Code Playgroud)
如果用户输入了字符串,则没有任何东西阻止用户将字符串传递给您的程序';system "rm -rf /bin"'.
因此,正确解决您的问题需要编写或使用表达式解析器.
顺便说一下,你不应该使用$a和$b作为变量名称作为sort使用的神奇包本地变量,因此它们免于严格 - 你必须在程序中始终使用严格和警告.
$a = "60"; $b = "< 80";
if( eval($a. $b)){
print "ok";
}
Run Code Online (Sandbox Code Playgroud)
请参阅perldoc eval了解更多信息