类似于方式 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上的(旧)交流的建议:

https://groups.google.com/group/perl.perl5.porters/browse_thread/thread/f93da6bde02a91c0/ba43854e3c59a744?hl=en&ie=UTF-8&q=perl+tie+stash#ba43854e3c59a744

其他提示

这个问题有点晚了,但是尽管不可能使用Tie来做到这一点,但变量:: Magic允许您将魔术固定在藏匿处,从而实现类似的东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top