用单引号或双引号括起来的Perl eval EXPR
我可以从perldoc-f eval中看到以下内容:用单引号或双引号括起来的Perl eval EXPR,perl,eval,double-quotes,single-quotes,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. print $@ if $@ 我看到EXPR用单引号或双引号括起来,例如 use strict; use warnings; f
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.
print $@ if $@
我看到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
的一部分还是仅仅是分隔符?如果将其更改为单引号,程序将崩溃,因此引号的含义似乎与单引号或双引号字符串中的含义相同
谢谢,引号不是eval语法的一部分。EXPR表示任何表达式,无论是带引号的字符串、变量、函数调用、某个操作的结果还是其他任何表达式
更改为单引号不应使程序崩溃,但不会插入变量,生成无法成功求值的代码,使求值返回undef并在$@中设置错误消息。在求值后添加下一个代码
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.
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 "
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并将$@
设置为标量,该标量是在(eval 1)第1行的“2$operator”附近找到的。我仍然感到困惑。表达式是“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代码执行。