質問

方法に似ています 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 -DT foo.pl
...
### 14:LEX_NORMAL/XOPERATOR ";\n"
### Pending identifier '$Target::x'
Bad symbol for scalar at foo.pl line 14.

':: Target'のGVは、それを結びつけると他の何かに置き換えられると思います。 Tie()が少し混乱していることを考えると、私はあなたがやろうとしていることは機能しないのではないかと疑っています。

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

他のヒント

質問に少し遅れていますが、TIEを使用してこれを行うことはできませんが、変数:: Magicを使用すると、魔法を隠し場所に取り付けて、同様のことを達成できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top