类似于AUTOLOAD
可用于按需定义子例程的方式,我想知道是否有一种方法可以绑定包的存储,以便我可以拦截对该包中变量的访问。
我已经尝试了以下想法的各种排列,但似乎都没有奏效:
{package Tie::Stash;
use Tie::Hash;
BEGIN {our @ISA = 'Tie::StdHash'}
sub FETCH {
print "calling fetch\n";
}
}
{package Target}
BEGIN {tie %Target::, 'Tie::Stash'}
say $Target::x;
这在最后一行消失Bad symbol for scalar ...
,没有打印"calling fetch"
。如果say $Target::x;
删除该行,程序将正常运行并退出。
我的猜测是,失败与 stash 类似,但与哈希不同,因此标准的 tie 机制无法正常工作(或者可能只是 stash 查找永远不会调用 tie 魔法)。
有谁知道这是否可能?纯 Perl 最好,但 XS 解决方案还可以。