Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用单引号或双引号括起来的Perl eval EXPR_Perl_Eval_Double Quotes_Single Quotes - Fatal编程技术网

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

用单引号或双引号括起来的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

我可以从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;

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
如果添加代码I建议,您将看到错误:

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代码执行。