如何在Perl中的变量中"存储"运算符?

Ric*_*evi 8 perl

我正在寻找一种在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 在他的回答评论中完美地解释了这一点.


fri*_*edo 8

如何定义包含所需条件的函数:

my $cond = sub { $_[0] < 80 };

if ( $cond->( $a ) ) { 
     ...
}
Run Code Online (Sandbox Code Playgroud)


Sin*_*nür 8

这应该是一个评论,但评论太像这样的东西,所以我做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使用的神奇包本地变量,因此它们免于严格 - 你必须在程序中始终使用严格警告.

  • @thenduks:我愿意.一个人应该*完全*理解不使用任何一个pragma的后果,并且能够为这个场合辩护.对于初学者,不应该容忍. (4认同)

gho*_*g74 7

$a = "60"; $b = "< 80";
if( eval($a. $b)){
  print "ok";
}
Run Code Online (Sandbox Code Playgroud)

请参阅perldoc eval了解更多信息