Gibt es in Perl einen Unterschied zwischen direktem Glob Aliasing und Aliasing über den Stash?

8

Gibt es in Perl jemals einen Unterschied zwischen den folgenden zwei Konstrukten:

%Vor%

und

%Vor%

Sie scheinen die gleiche Funktion zu haben (Aliasing aller Slots in *main::foo zu denen, die in *main::bar definiert sind), aber ich frage mich nur, ob diese Äquivalenz immer gilt.

    
Eric Strom 06.07.2011, 21:36
quelle

3 Antworten

9

Vielleicht nicht die Art von Unterschied, nach der Sie gesucht haben, aber es gibt zwei große Unterschiede zwischen *main::foo und $main::{foo} ; das erste sieht den Glob im Stash zur Kompilierzeit nach und erstellt ihn bei Bedarf, während letzterer zur Laufzeit nach dem Glob im Stash sucht und ihn nicht erstellt.

Dies kann einen Unterschied machen für alles andere, was im Stash herumstochert, und es kann sicherlich beeinflussen, ob Sie eine used only once Warnung erhalten.

    
ysth 07.07.2011, 03:56
quelle
3

Das folgende Skript:

%Vor%

Ausgaben:

%Vor%

Wenn also *main::foo = *main::bar; nicht dasselbe tut wie $main::{foo} = $main::{bar}; , dann weiß ich nicht, wie man einen praktischen Unterschied erkennt. ;) Aus einer Syntaxperspektive kann es jedoch Situationen geben, in denen es einfacher ist, eine Methode gegenüber einer anderen zu verwenden. ... es gelten immer die üblichen Warnungen, dass in der Symboltabelle herumgespielt wird.

    
DavidO 06.07.2011 23:45
quelle
3

Wenn Sie auf den Stash als $A::{foo} = $obj zugreifen, können Sie alles in der Symboltabelle platzieren, während *A::foo = $obj places $obj auf dem erwarteten Slot des Typeglobs nach $obj type platziert.

Zum Beispiel:

%Vor%     
salva 07.07.2011 00:57
quelle

Tags und Links