gpt4 book ai didi

perl - 使用 typeglob 重新定义 perl 函数不能按预期工作

转载 作者:行者123 更新时间:2023-12-01 09:44:45 25 4
gpt4 key购买 nike

这个例子工作正常:

use File::Slurp qw(read_file);
local *File::Slurp::read_file = sub {
return 'test';
};

warn File::Slurp::read_file('/root/test.txt'); # return 'test'

这个也是:
use File::Slurp qw(read_file);
local *read_file = sub {
return 'test';
};

warn read_file('/root/test.txt'); # return 'test'

但是如果我在 typeglob 中使用函数的全名,它就不起作用并尝试读取文件:
use File::Slurp qw(read_file);
local *File::Slurp::read_file = sub {
return 'test';
};

warn read_file('/root/test.txt');

谁能解释为什么我不能通过完整的命名空间重新定义子程序, File::Slurp::read_file , 并使用简称?

在对象方法的情况下,它工作正常:
use LWP::UserAgent;
local *LWP::UserAgent::get = sub {
return HTTP::Response->new( undef, undef, undef, 'Hello world' );
};

my $ua = LWP::UserAgent->new;
warn $ua->get()->content;

最佳答案

您的问题是由导出的工作方式引起的。以及 Perl 如何将名称分配给值。在 Perl 中,每个名称都是指向一个值的链接,因此 sub read_line { ... }创建一个匿名子例程引用并将其分配给名称 &read_line

use File::Slurp qw(read_file);
local *File::Slurp::read_file = sub {
return 'test';
};

在您的第一个示例中,您将覆盖 File::Slurp::read_file然后调用 File::Slurp::read_file所以你得到你的版本 File::Slurp::read_file .
use File::Slurp qw(read_file);
local *read_file = sub {
return 'test';
};

在您的第二个示例中,您将覆盖 read_file 的导入版本然后调用它,以便您获得 read_file 的版本
use File::Slurp qw(read_file);
local *File::Slurp::read_file = sub {
return 'test';
};

在您的第三个示例中,发生以下情况:
use File::Slurp;做一个 *read_file = \&File::Slurp::read_file在编译时,这使得 read_file指向 File::Slurp::read_file 的现有版本.然后您的代码分配 *File::Slurp::read_file一个新的子引用,但这不会改变 read_file它仍然指向 File::Slurp::read_file 的子引用原指。然后您调用 read_file它指向 File::Slurp::read_file 的原始导入版本

在您的第四个示例中,Perl 的方法解析系统意味着您正在调用 LWP::UserAgent::get所以这相当于你的第一个例子。

关于perl - 使用 typeglob 重新定义 perl 函数不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51610058/

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