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ソリューションは問題ありません。
'BEGIN'ブロックから' tie ... '呼び出しを実行すると機能しますか? – mob
後で結びつけると、perlは既に$ Target :: xを保持するglobを探していて、何も起こりません。なぜperl -M0 = Terse foo.plを実行してみてください。 – Alex