我可以从perldoc -f eval
看到以下内容:
eval EXPR
eval BLOCK
eval In the first form, the return value of EXPR is parsed and
executed as if it were a little Perl program.
我已经看到EXPR被单引号或双引号括起来,例如,
use strict;
use warnings;
for my $operator ( qw?+ - *? )
{
my $sum = eval "3 $operator 2";
print "$sum\n";
}
我对引号有疑问:"3 $operator 2"
在这种情况下为EXPR
,第一次迭代时此EXPR
的返回值为"3 + 2"
,根据perldoc,"3 + 2"
被解析并执行,但它是一个双引号字符串文字,Perl最终如何得到5
的结果?我的意思是,当EXPR
被单引号或双引号括起来时,引号是EXPR
的一部分还是仅仅是分隔符?如果将其更改为单引号,程序将崩溃,因此引号似乎与单引号或双引号字符串文字中的含义相同。
由于
答案 0 :(得分:3)
引号不是eval语法的一部分。 EXPR表示任何表达式,无论是带引号的字符串,变量,函数调用,某些操作的结果,还是其他任何表达式。
更改为单引号不应该使程序崩溃,但不会插入变量,生成不能成功执行的代码,使eval返回undef并在$ @中设置错误消息。
答案 1 :(得分:1)
eval("3 $operator 2")
字符串文字(即Perl代码)"3 $operator 2"
生成字符串3 + 2
,将其传递给eval
以评估为Perl代码。这导致eval
返回第五个数字。
eval('3 $operator 2')
字符串文字(即Perl代码)'3 $operator 2'
生成字符串3 $operator 2
,将其传递给eval
以评估为Perl代码。这不是有效的Perl代码,因此eval
会返回undef并将$@
设置为Scalar found where operator expected at (eval 1) line 1, near "2 $operator"...
答案 2 :(得分:0)
在eval
之后添加下一个代码:
print $@ if $@
这会告诉你什么是错的。
在你的例子中
3+2
3 $operator 2
如果您添加代码我建议您会看到错误:
Scalar found where operator expected at (eval 1) line 1, near "2 $operator"
(Missing operator before $operator?)
Number found where operator expected at (eval 1) line 1, near "$operator 3"
(Missing operator before 3?)
syntax error at (eval 1) line 1, near "2 $operator "