这个例子工作正常:
use File::Slurp qw(read_file);
local *File::Slurp::read_file = sub {
return 'test';
};
warn File::Slurp::read_file('/root/test.txt'); # return 'test'
Run Code Online (Sandbox Code Playgroud)
这个也是:
use File::Slurp qw(read_file);
local *read_file = sub {
return 'test';
};
warn read_file('/root/test.txt'); # return 'test'
Run Code Online (Sandbox Code Playgroud)
但是如果我在typeglob中使用函数的全名它不起作用并尝试读取文件:
use File::Slurp qw(read_file);
local *File::Slurp::read_file = sub {
return 'test';
};
warn read_file('/root/test.txt');
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么我不能通过完整命名空间重新定义子程序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;
Run Code Online (Sandbox Code Playgroud)
您的问题是由导出的工作方式引起的.以及Perl如何为值分配名称.在Perl中,每个名称都是一个值的链接,因此sub read_line { ... }创建一个匿名子例程引用并将其分配给名称&read_line
use File::Slurp qw(read_file);
local *File::Slurp::read_file = sub {
return 'test';
};
Run Code Online (Sandbox Code Playgroud)
在您的第一个示例中,您将覆盖File::Slurp::read_file然后调用,File::Slurp::read_file以便获得您的版本File::Slurp::read_file.
use File::Slurp qw(read_file);
local *read_file = sub {
return 'test';
};
Run Code Online (Sandbox Code Playgroud)
在第二个示例中,您将覆盖导入的版本,read_file然后调用它以便获得您的版本read_file
use File::Slurp qw(read_file);
local *File::Slurp::read_file = sub {
return 'test';
};
Run Code Online (Sandbox Code Playgroud)
在第三个示例中,会发生以下情况:
use File::Slurp;做一个*read_file = \&File::Slurp::read_file在编译的时候,这使得read_file点的现有版本File::Slurp::read_file.然后你的代码会分配*File::Slurp::read_file一个新的sub ref,但是这不会改变read_file,它仍然指向File::Slurp::read_file最初指向的sub ref .然后调用read_file哪个指向原始导入的版本File::Slurp::read_file
在你的第四个例子中,Perl的方法解析系统意味着你正在调用,LWP::UserAgent::get所以这相当于你的第一个例子.
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |