Eval循环语法

时间:2018-04-09 10:14:06

标签: perl

我正在练习关于codefights的Perl。

我见过上一个任务中有人给Eval一个列表来制作一个数组。

@a = map eval s/\B/*/gr,  0 .. 10000;

然而,当我尝试向eval提供一个列表时,它会给我一个错误

my ($a,$b,$c)=(1,2,3);
return 1 if eval "$a$_$b==$c", for qw "+ - / *";

此行也无法按预期工作。

my ($a, $b, $c) = @_;
@aa=map eval "$a $_ $b", for qw "+ - / *";

然而,这有效

my ($a,$b,$c)=(1,2,3);
for (qw "+ - / *")
{
    return 1 if eval "$a$_$b==$c";
}

有人可以解释这些陈述之间的区别是什么吗?

由于

1 个答案:

答案 0 :(得分:7)

你误解了你的第一个例子。

my @a = map eval s/\B/*/gr,  0 .. 10000;

这不会将列表传递给evaleval s/...//是非阻止形式的map的参数。添加括号时,这一点会变得更加清晰。

my @a = map( eval( s/\B/*/gr ),  0 .. 10000 );

它将为每个数字调用eval语句,并返回结果列表,该列表将分配给@a。代码在每隔一个数字后面添加一个星号,并构建一个结果字符串列表。

在此代码中,您再次误解了map的作用。

my ($a, $b, $c) = @_;
@aa=map eval "$a $_ $b", for qw "+ - / *";

map本质上是一个就地for循环。添加postfix for在这里没有任何用处。 map已经迭代了列表中的所有元素。在这种情况下,列表是"+", "-", "/", "*",由qw//运算符创建。

摆脱for,它会起作用。

my ( $x, $y ) = ( 1, 2 );
my @results = map eval "$x $_ $y", qw "+ - / *";

结果如下:

 3,
 -1,
 0.5,
 2

我建议你read up on map