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 用单引号或双引号括起来的主要内容,如果未能解决你的问题,请参考以下文章