覆盖" eval"在perl

时间:2015-07-09 15:14:47

标签: perl

拥有以下内容:

use 5.014;
use warnings;
BEGIN {
    use subs qw(int);
    sub int {
        print STDERR "\tthe int got: $_[0]\n";
        my $res =  CORE::int($_[0]);
        print STDERR "\tCORE::int: $res\n";
        return $res;
    }
}

my $x;
$x = 1.1 ; say "result of int($x) is: ", int($x);
$x = 6.6 ; say "result of int($x) is: ", int($x);

打印

    the int got: 1.1
    CORE::int: 1
result of int(1.1) is: 1
    the int got: 6.6
    CORE::int: 6
result of int(6.6) is: 6

int函数被我自己的函数覆盖,它执行一些调试打印,并返回原始(CORE)实现的结果。

eval寻找相同内容。但是,可能因为eval不像int这样的函数,如上所述的覆盖并不适用于eval。

有可能实现这一点吗?例如。想要用我自己的eval覆盖evaleval "$string"),例如:

  • 应该打印获取的字符串
  • 并且应该调用eval的核心实现

编辑: 根据评论,上述eval是不可能的。所以:

简而言之:在评估之前,我希望在我的程序中调试所有 eval "$strings"。有可能吗?

1 个答案:

答案 0 :(得分:5)

eval无法以与int相同的方式覆盖,因为其界面无法原型化。

$ perl -E'say prototype("CORE::".$ARGV[0]) // "[undef]"' int
_

$ perl -E'say prototype("CORE::".$ARGV[0]) // "[undef]"' eval
[undef]

但是有一些好消息!有人对你有类似的需求,通过操纵操作码来解决它,并以overload::eval的形式发布了CPAN解决方案,供所有人使用。

该文档声明只影响eval词法范围内的use,但有一个隐藏的标记$overload::eval::GLOBAL = 1;会影响对eval EXPR的所有调用。< / p>