Perl eval EXPR 用单引号或双引号括起来

Posted

技术标签:

【中文标题】Perl eval EXPR 用单引号或双引号括起来【英文标题】:Perl eval EXPR enclosed by sinlge or double quotes 【发布时间】:2016-09-29 14:57:14 【问题描述】:

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

谢谢

【问题讨论】:

qw 分隔符的好选择。 【参考方案1】:

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

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

【讨论】:

我还是一头雾水。表达式是"3 $operator 2",它是一个双引号字符串。 eval 应该 1) 首先评估字符串,然后 2) 评估返回值。无论$operator 哪个阶段被+ 插值,结果都是另一个双引号字符串"3 + 2"。 Perl 如何继续将这种双引号字符串评估为5?它是一个 5 个字符的字符串,不是算术表达式。 因为它是一个双引号字符串 Perl 将首先插入变量,使您的字符串变为3 + 5,这是表达式的返回值,然后将其提供给 eval。然后 eval 将解析它以确保其有效的 perl 语法是。然后 eval 正在执行语法并非常正确地产生 5 作为结果。您一直将其称为字符串,但这不是 eval 的看法。正如 eval 文档所说,eval 将返回值作为一个小 perl 程序执行。将 eval 想象成 perl -e '3 + 5' @ChrisDoyle,我的意思是返回值是"3 + 2"(双引号字符串),而不是3 + 2(算术表达式)。对吗? 它没有将它作为单引号或双引号字符串传递。正如我所说,它只是将3 + 2 给评估。根本没有引号。然后 eval 将其解析为 perl 代码,然后将其作为 perl 代码执行。【参考方案2】:

eval("3 $operator 2")

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

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"...

【讨论】:

【参考方案3】:

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 "

【讨论】:

以上是关于Perl eval EXPR 用单引号或双引号括起来的主要内容,如果未能解决你的问题,请参考以下文章

向MySQL数据库插入单引号或双引号

Perl 正则表达式匹配大型 Unicode 代码点

学习random模块遇到的问题

Perl双引号和单引号的区别

JavaScript 学习-11.字符串 String 对象

python基础