类似于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类似,但与has不同,因此标准的tie机制不能正常工作(或者可能只是stash查找从不调用tie魔法)。
有没有人知道这是否可能?纯Perl将是最好的,但XS解决方案也不错。
发布于 2011-04-28 10:23:29
你遇到了一个编译时的内部错误("Bad symbol for scalar"),当Perl试图计算出'$Target::x‘应该是什么时,就会发生这种情况,你可以通过运行一个调试Perl来验证:
perl -DT foo.pl
...
### 14:LEX_NORMAL/XOPERATOR ";\n"
### Pending identifier '$Target::x'
Bad symbol for scalar at foo.pl line 14.我认为'::Target‘的GV在你绑定()它的时候会被其他东西所取代,所以任何最终试图到达它的内部散列的东西都不能。考虑到tie()有点混乱,我怀疑您正在尝试做的事情不会成功,这也是p5p上的这组(旧的)交换的建议:
发布于 2013-08-15 21:28:50
这个问题有点晚了,但是尽管不能使用tie来做这件事,但Variable::Magic允许您将魔法附加到stash上,从而实现类似的效果。
https://stackoverflow.com/questions/5809854
复制相似问题