2011-04-27 10 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; 

これは、これまでに"calling fetch"を印刷せずに、最後の行にBad symbol for scalar ...で死にます。 say $Target::x;行が削除されると、プログラムは実行され、正しく終了します。

私の推測によれば、stashは似ていますが、ハッシュと同じではないので、標準的なタイメカニズムが正しく機能していません(または、stashルックアップがタイマジックを呼び出すことはありません)。

これが可能なら誰でも知っていますか?純粋なPerlが最適ですが、XSソリューションは問題ありません。

+0

'BEGIN'ブロックから' tie ... '呼び出しを実行すると機能しますか? – mob

+0

後で結びつけると、perlは既に$ Target :: xを保持するglobを探していて、何も起こりません。なぜperl -M0 = Terse foo.plを実行してみてください。 – Alex

答えて

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. 

私は「::ターゲット」のGVが最終的にその内部ハッシュにすることはできませんを取得しようとしますので、どんなことをあなたはネクタイ他の何か()、それによって置き換えられていると思います。

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

1
:タイは()混乱の少しであることを考えると、私はあなたがP5Pの交換のこの(古い)のセットでも提案され、動作しません何をしようとして疑います

少し遅れてしまいましたが、これを行うためにネクタイを使用することはできませんが、Variable :: Magicを使用すると、マジックを隠しに付けて、同様の効果を得ることができます。

関連する問題