Frage

Ähnlich wie der Weg AUTOLOAD Kann verwendet werden, um Unterprogramme bei Bedarf zu definieren. Ich frage mich, ob es eine Möglichkeit gibt, den Vorrat eines Pakets zu binden, damit ich den Zugriff auf Variablen in diesem Paket abfangen kann.

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

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

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

Ich vermute, dass das Versagen damit zu tun hat, dass Verstöße wie Hashes, aber nicht das gleiche wie Hashes, nicht richtig funktioniert (oder es könnte nur sein, dass Stash -Lookup niemals die Krawattenmagie aufruft).

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

War es hilfreich?

Lösung

Sie treffen einen internen Fehler der Kompilierzeit ("schlechtes Symbol für Skalar"). Dies geschieht, während Perl versucht, herauszufinden, was '$ target :: x' sein sollte, was Sie durchführen können, indem Sie ein Debugging Perl mit:

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

Ich denke, der GV für ':: target' wird durch etwas anderes ersetzt, wenn Sie ihn binden (), so dass alles, was schließlich versucht, zu seinem internen Hash zu gelangen, nicht kann. Angesichts der Tie () ist ich ein bisschen ein Chaos, ich vermute, was Sie tun, was Sie tun, wird nicht funktionieren, was auch durch diesen (alten) Set von Börsen an P5P vorgeschlagen wird:

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

Andere Tipps

Ein wenig spät in die Frage, aber obwohl es nicht möglich ist, Tie zu verwenden, können Sie Variable :: Magic mit dem Anbringen von Magie an einen Vorrat anbringen und dadurch etwas Ähnliches erreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top