您的代码正在为 name 分配一个子例程定义&Foo::fork
,您始终可以通过调用完全限定的函数 name或在命名空间中Foo::fork()
使用 sigil 来执行它。&fork
Foo
package Foo;
TestModule->new('Foo')->mock(fork => sub { ... });
Foo::fork; # calls mocked function
⋔ # calls mocked function
{ package Bar; &fork } # error: no &Bar::fork
fork; # calls builtin
覆盖内置函数,以便调用 barefork
调用您的函数而不是内置函数,“只能通过在编译时从模块导入名称来完成”。如果这很难理解,只需知道subs
pragma 满足您的这个条件:
package Foo;
use subs 'fork'; # compile-time import of name 'fork'
TestModule->new('Foo')->mock(fork => sub { ... });
Foo::fork; # calls mocked function
⋔ # calls mocked function
fork; # now calls mocked function
{ package Bar; fork; } # calls builtin
CORE::fork; # always calls builtin