与AUTOLOAD
可用于按需定义子例程的方式类似,我想知道是否有一种方法可以绑定(bind)程序包的存储,以便可以拦截对该程序包中变量的访问。
我已经尝试过以下想法的各种排列,但似乎都行不通:
{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;
行,则程序将运行并正确退出。我的猜测是,失败与隐藏(例如,但与哈希不同)有关,因此标准的绑定(bind)机制无法正常工作(或者隐藏查询根本不会调用绑定(bind)魔术)。
有人知道这是否可能吗?纯Perl是最好的,但是XS解决方案是可以的。
最佳答案
您遇到编译时内部错误(“标量的错误符号”),这是在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()它时会被其他东西替换,因此最终试图获取其内部哈希的任何东西都无法。鉴于tie()有点困惑,我怀疑您要尝试执行的操作将不起作用,这在p5p上的这组(旧)交易所也暗示了这一点:
https://groups.google.com/group/perl.perl5.porters/browse_thread/thread/f93da6bde02a91c0/ba43854e3c59a744?hl=en&ie=UTF-8&q=perl+tie+stash#ba43854e3c59a744