与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;
这一行,程序可以正常运行并退出。
我猜测这个失败可能与符号表类似但不同于哈希表有关,因此标准的tie机制无法正常工作(或者可能是符号表查找从未调用tie魔术)。
有人知道这是否可能吗?最好使用纯Perl,但XS解决方案也可以。
tie ...
调用从BEGIN
块中移除,它是否能正常工作? - mob