拥有以下内容:
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覆盖eval
(eval "$string"
),例如:
编辑:
根据评论,上述eval
是不可能的。所以:
简而言之:在评估之前,我希望在我的程序中调试所有 eval "$strings"
。有可能吗?
答案 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>