我正在练习关于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";
}
有人可以解释这些陈述之间的区别是什么吗?
由于
答案 0 :(得分:7)
你误解了你的第一个例子。
my @a = map eval s/\B/*/gr, 0 .. 10000;
这不会将列表传递给eval
。 eval 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
。