Question

Similaire à la façon AUTOLOAD peut être utilisé pour définir la demande des sous-routines, je me demande s'il y a un moyen de lier la planque d'un paquet pour que je puisse intercepter l'accès aux variables dans ce paquet.

J'ai essayé diverses permutations de l'idée suivante, mais aucun ne semble fonctionner:

{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;  

Ce meurt avec Bad symbol for scalar ... sur la dernière ligne, sans jamais l'impression "calling fetch". Si la ligne say $Target::x; est supprimé, le programme se exécute et sort correctement.

Je pense que l'échec a à voir avec stashes être comme, mais pas la même chose que hash, de sorte que le mécanisme d'attache standard ne fonctionne pas correctement (ou peut-être simplement que Stash invoque recherche jamais la magie de cravate).

Est-ce que quelqu'un sait si cela est possible? Perl pur serait préférable, mais les solutions XS sont ok.

Était-ce utile?

La solution

Vous frappez un temps de compilation erreur interne ( « symbole mauvais pour scalaire »), cela se produit alors que Perl essaie de comprendre ce « $ cible :: x » doit être, que vous pouvez vérifier en exécutant un Perl débogage avec:

perl -DT foo.pl
...
### 14:LEX_NORMAL/XOPERATOR ";\n"
### Pending identifier '$Target::x'
Bad symbol for scalar at foo.pl line 14.

Je pense que le GV pour « :: Target » est remplacé par quelque chose d'autre lorsque vous liez (), de sorte que tout ce qui essaie finalement de se rendre à son hachage interne ne peut pas. Étant donné que tie () est un peu un gâchis, je soupçonne que ce que vous essayez de faire ne fonctionnera pas, ce qui est également suggérée par cette (ancienne) ensemble des échanges sur P5P:

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

Autres conseils

Un peu plus tard à la question, mais bien qu'il est impossible d'utiliser cravate pour ce faire, variable :: magique vous permet d'attacher la magie à une planque et d'obtenir ainsi quelque chose de similaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top