gpt4 book ai didi

perl - 在 perl 中覆盖 "eval"

转载 作者:行者123 更新时间:2023-12-03 21:07:06 25 4
gpt4 key购买 nike

具有以下内容:

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函数被我自己的函数覆盖,该函数执行一些调试打印,并返回原始(核心)实现的结果。

寻找相同的 eval .但是,可能是因为 eval不是 int 之类的函数上面的覆盖不适用于评估。

有可能实现这一点吗?例如。想要覆盖 eval ( eval "$string" )与我自己的 eval 如上所述,例如:
  • 应该打印得到的字符串
  • 并且应该调用 eval
  • 的核心实现

    编辑:
    根据评论,以上内容对于 eval 是不可能的。 .所以:

    简而言之:想要 的调试打印全部 eval "$strings"在我的程序中,在评估之前。有可能吗?

    最佳答案

    eval不能以与 int 相同的方式覆盖因为它的接口(interface)不能被原型(prototype)化。

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

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

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

    该文档声称仅影响 evaluse 的词法范围内,但有一个隐藏标志 $overload::eval::GLOBAL = 1;这使它影响对 eval EXPR 的所有调用.

    关于perl - 在 perl 中覆盖 "eval",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31321603/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com