Gibt es in Perl eine Möglichkeit, einen Vorrat zu binden?

8

Ähnlich wie AUTOLOAD verwendet werden kann, um Unterprogramme auf Anforderung zu definieren, frage ich mich, ob es eine Möglichkeit gibt, den Stash eines Pakets zu binden, so dass ich den Zugriff auf Variablen in diesem Paket abfangen kann.

Ich habe verschiedene Permutationen der folgenden Idee ausprobiert, aber keine scheint zu funktionieren:

%Vor%

Dies stirbt mit Bad symbol for scalar ... in der letzten Zeile, ohne jemals "calling fetch" zu drucken. Wenn die Zeile say $Target::x; entfernt wird, wird das Programm ordnungsgemäß ausgeführt und beendet.

Meine Vermutung ist, dass der Fehler damit zu tun hat, dass Stashes ähnlich sind, aber nicht dasselbe wie Hashes, also funktioniert der Standard-Bindemechanismus nicht richtig (oder es kann sein, dass Stash-Lookup nie Tie-Magic aufruft).

Weiß jemand, ob das möglich ist? Pure Perl wäre am besten, aber XS-Lösungen sind in Ordnung.

    
Eric Strom 27.04.2011, 20:02
quelle

2 Antworten

4

Sie treffen einen internen Fehler bei der Kompilierung ("Schlechtes Symbol für Skalar"), dies geschieht, während Perl versucht herauszufinden, was "$ Target :: x" sein sollte, was Sie durch Ausführen eines Debug-Perls überprüfen können mit:

%Vor%

Ich denke, das GV für ':: Target' wird durch etwas anderes ersetzt, wenn Sie es binden (), so dass das, was letztendlich versucht, zu seinem internen Hash zu gelangen, dies nicht kann. Angesichts der Tatsache, dass tie () ein wenig unordentlich ist, vermute ich, dass das, was Sie versuchen zu tun, nicht funktionieren wird, was auch von diesem (alten) Austauschprogramm auf p5p vorgeschlagen wird:

Ссылка

    
Alex 28.04.2011, 02:23
quelle
1

Etwas zu spät zur Frage, aber obwohl es nicht möglich ist, die Bindung zu benutzen, erlaubt Variable :: Magic, Magie an einen Vorrat anzuhängen und dadurch etwas Ähnliches zu erreichen.

    
tobyink 15.08.2013 13:28
quelle

Tags und Links