2011-04-27 125 views
8

類似於AUTOLOAD可用於按需定義子例程的方式,我想知道是否有一種方法可以綁定一個包的隱藏,以便可以攔截對該包中變量的訪問。在Perl中,有什麼方法可以綁定一個存儲?

我已經試過以下想法的各種排列,但沒有一個似乎工作:

{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解決方案是可以的。

+0

如果你從'BEGIN'塊中取出'tie ...'調用,它會起作用嗎? – mob 2011-04-28 05:38:01

+0

如果你以後再打領帶,perl已經去過了,並且找到了持有$ Target :: x的glob,所以沒有任何反應。嘗試運行perl -M0 = Terse foo.pl來查看原因。 – Alex 2011-04-28 09:11:04

回答

4

您正在編譯時發生內部錯誤(「標量錯誤符號」),這種情況發生在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是由()別的東西,當你配合,所以,無論最終設法得到它的內部散不能更換。鑑於領帶()是一個亂七八糟的一點點,我懷疑你正在試圖做不會通過這個P5P(舊)一套交流的工作,這也暗示什麼:

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

1

這個問題有點遲,但儘管使用tie來做到這一點是不可能的,但Variable :: Magic可以讓你將魔法附加到一個藏匿處,從而達到類似的效果。

相關問題