由sinlge或双引号括起来的Perl eval EXPR

时间:2016-09-29 14:57:14

标签: perl eval double-quotes single-quotes

我可以从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的一部分还是仅仅是分隔符?如果将其更改为单引号,程序将崩溃,因此引号似乎与单引号或双引号字符串文字中的含义相同。

由于

3 个答案:

答案 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 "