首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Perl中,有什么方法可以绑定stash吗?

在Perl中,有什么方法可以绑定stash吗?
EN

Stack Overflow用户
提问于 2011-04-28 04:02:53
回答 2查看 317关注 0票数 8

类似于AUTOLOAD可以用于按需定义子例程的方式,我想知道是否有一种方法可以绑定包的存储,以便我可以拦截对该包中变量的访问。

我尝试了以下想法的各种组合,但似乎都不起作用:

代码语言:javascript
复制
{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解决方案也不错。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-28 10:23:29

你遇到了一个编译时的内部错误("Bad symbol for scalar"),当Perl试图计算出'$Target::x‘应该是什么时,就会发生这种情况,你可以通过运行一个调试Perl来验证:

代码语言:javascript
复制
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

票数 4
EN

Stack Overflow用户

发布于 2013-08-15 21:28:50

这个问题有点晚了,但是尽管不能使用tie来做这件事,但Variable::Magic允许您将魔法附加到stash上,从而实现类似的效果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5809854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档