2

我可以从以下内容中看到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这种情况下,this的返回值EXPR"3 + 2"第一次迭代,根据perldoc,"3 + 2"被解析并执行,但它是一个双引号字符串文字,Perl如何得到结果最终5?我的意思是,当EXPR用单引号或双引号括起来时,引号是分隔符的一部分EXPR还是只是分隔符?如果将其更改为单引号,程序会崩溃,因此引号的含义似乎与单引号或双引号字符串文字中的含义相同。

谢谢

4

3 回答 3

3

引号不是 eval 语法的一部分。EXPR 表示任何表达式,无论是带引号的字符串、变量、函数调用、某些操作的结果还是其他任何内容。

更改为单引号不应使程序崩溃,但不会插入您的变量,生成不会成功评估的代码,使 eval 返回 undef 并在 $@ 中设置错误消息。

于 2016-09-29T15:10:48.110 回答
1

eval("3 $operator 2")

字符串文字(即 Perl 代码)"3 $operator 2"产生 string 3 + 2,它被传递给eval作为 Perl 代码进行评估。这导致数字 5 返回eval

eval('3 $operator 2')

字符串文字(即 Perl 代码)'3 $operator 2'产生 string 3 $operator 2,它被传递给eval作为 Perl 代码进行评估。这不是有效的 Perl 代码,因此eval返回 undef 并设置$@Scalar found where operator expected at (eval 1) line 1, near "2 $operator"...

于 2016-09-29T19:32:35.380 回答
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 "
于 2016-09-29T17:05:22.893 回答