理解Perl的'eval`

Red*_*ket 0 perl

我试图了解Perl的eval功能.这是我写的测试脚本:

[red@tools-dev1 ~]$ cat evaltest.pl 
#!/usr/local/bin/perl -w
use strict;

while(<DATA>) {
    chomp;
    my ($arg1, $arg2, $op ) = split /,/;
    my $cmd = "$arg1 $op $arg2";    
    print "$cmd\n"; 
    my $rc = eval { $cmd };
    print "rc is [$rc]\n";
}


__DATA__
1,2,!=
1,1,!=
1,2,=
1,1,=
1,2,==
2,3,>
3,2,>
3,3,>
2,3,>=
3,2,>=
3,3,>=
2,3,<
3,2,<
3,3,<
2,3,<=
3,2,<=
3,3,<=
Run Code Online (Sandbox Code Playgroud)

当我执行时,我得到这个输出...

[red@tools-dev1 ~]$ ./evaltest.pl 
1 != 2
rc is [1 != 2]
1 != 1
rc is [1 != 1]
1 = 2
rc is [1 = 2]
1 = 1
rc is [1 = 1]
1 == 2
rc is [1 == 2]
2 > 3
rc is [2 > 3]
3 > 2
rc is [3 > 2]
3 > 3
rc is [3 > 3]
2 >= 3
rc is [2 >= 3]
3 >= 2
rc is [3 >= 2]
3 >= 3
rc is [3 >= 3]
2 < 3
rc is [2 < 3]
3 < 2
rc is [3 < 2]
3 < 3
rc is [3 < 3]
2 <= 3
rc is [2 <= 3]
3 <= 2
rc is [3 <= 2]
3 <= 3
rc is [3 <= 3]
Run Code Online (Sandbox Code Playgroud)

...我试图获得看起来更像这样的输出:

1 != 2
rc is [1]
1 != 1
rc is [0]
1 = 2
rc is [0]
1 = 1
rc is [1]
1 == 2
rc is [0]
2 > 3
rc is [0]
3 > 2
rc is [1]
3 > 3
rc is [0]
2 >= 3
rc is [0]
3 >= 2
rc is [1]
3 >= 3
rc is [1]
2 < 3
rc is [1]
3 < 2
rc is [0]
3 < 3
rc is [0]
2 <= 3
rc is [1]
3 <= 2
rc is [0]
3 <= 3
rc is [1]
Run Code Online (Sandbox Code Playgroud)

yst*_*sth 6

有两种形式的评估,你会混淆它们.eval BLOCK当eval本身被编译时,One()编译BLOCK; 它唯一能做的就是捕获异常并存储它们$@.您正在寻找eval STRING,它编译并执行给定表达式中的Perl代码(存储任何编译时错误或运行时异常$@).

所以说eval $cmd而不是eval { $cmd }.

另请注意,比较运算符返回一个特殊的布尔值false值,该值在字符串上下文中为空字符串,但在数字上下文中为0,因此您的输出将具有rc is [],而不是rc is [0].

当存在编译错误(这将发生在你的1 = 11 = 2)时,eval将返回undef(正如我所提到的,将错误放入$@).

  • @Oktalist:不,false是一个特殊值,而不是空字符串.比较`使用警告; $ x =""; 打印$ x + 42;`来'使用警告; $ x = 0 == 1; 打印$ x + 42;` (2认同)