题
类似于方式 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;
删除行,程序运行并正确退出。
我的猜测是,失败与藏匿处的情况有关,但与哈希相同,因此标准的领带机制无法正常工作(或者可能只是藏匿处的查找永远不会传来绑带魔术)。
有人知道这是否可能吗?纯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()有点混乱,我怀疑您要做的事情无法正常工作,这也是P5P上的(旧)交流的建议:
其他提示
这个问题有点晚了,但是尽管不可能使用Tie来做到这一点,但变量:: Magic允许您将魔术固定在藏匿处,从而实现类似的东西。
不隶属于 StackOverflow