Halihallo alligator
leider kann ich dir nicht wirklich folgen.
Es geht etwas in die Internals von Perl. Etwas genauer geht es um die
interne Repräsentation von Variablen. Wie und wo diese gespeichert werden und ggf.
welche Konsequenzen damit hervorgerufen werden.
Was ich an dem QT-Bespiel nicht verstehe ist, was in diesem
Hash %{test::} drin steht bzw. warum das drin steht, was er mir da ausgibt ?!?
test war ja ein "test-Modul", dieses hat einen eigenen "Scope", d.h. Variablen, die
darin definiert sind, sind nicht "öffentlich", es sei denn man definiert sie mit
our oder use vars qw(...). Nun geht es mir um die Frage: Worin liegt genau der
Unterschied öffentlicher und privater Variablen. Perl verwaltet intern lokale
Variablen in einem Stack. Springt der Interpreter in eine neue Funktion, die zwei
Variablen $foo und $bar definiert, werden diese in den Modul-Stack gepushed; dort können
sie nach beliben geändert/undefiniert/wiederdefiniert werden, bis der Interpreter aus
der Funktion springt (eg. durch return), dann werden diese Variablen aus dem Stack
gepoped und so spricht man von "die Variable ging aus dem Scope". Etwas genauer gesagt,
wird der Referenzzähler um 1 verkleinert (das heisst, die Variable wird jetzt einmal
weniger gebraucht). Wurde die Variable nirgens sonst referenziert (eine Referenz darauf
gelegt), wird dieser Referenzzähler 0 und das Garbage Collection-System kann den
Speicherplatz der Variablen freigeben, da sie nicht mehr gebraucht wird.
OK, was hat das alles mit %{test::} zu tun? - %{test::} greift auf die sogenannte
"Symbol-Tabelle" des Moduls test zu. Die Symbol-Tabelle verwaltet (meiner bisherigen
Meinung nach: globale) Variablen (d.h. es ist eine Art Hash, der als Key den Namen
der Variablen speichert und der Value ist ein C-Pointer auf die Variablen-Datenstruktur).
Nun gut, da die Symbol-Tabelle nicht nur globale Variablen referenziert, wie ich bis
anhin dachte, nehme ich an, dass dies aufgrund der Performance gemacht wurde. Kommt eine
Variable in den aktuellen Scope wird sie in der Symbol-Tabelle referenziert, sodass
der Perlinterpreter schneller darauf zugreifen kann (man stelle sich vor, man müsste
bei jedem Zugriff durch den ganzen Stack nach der Variablen durchsuchen).
Hm, ist es das? - Die Performance?
OK, zurück zu dir alligator: ;)
Vereinfacht ausgedrückt, siehst du in %{main::} einfach alle aktiven Variablen, wenn
mich meine Feststellung nicht täuscht. Das * ist C-style und bedeutet "Referenz", du
hast also etwas wie:
test => *test::test
das heisst: "test" ist eine Variable, *test::test zeigt auf die interne Repräsentation
des Wertes dieser Variablen (sei sie nun Skalar, Hash, Array, Filehandle oder
eine sogenannte MagicVariable). OK, auf *test::test kannst du nicht zugreifen, das ist
einfach Text. Der Perlinterpreter hat dort aber wirklich eine Referenz auf die
Variable gesetzt, sodass er %{main::} einfach nach dem Variablen durchsuchen muss und
dann gleich die Referenz auf die Datenstruktur hat.
--- our vs use vars qw() vs my ---
Hm. our definiert eine Variable wie my, mit dem Unterschied, dass sie in der Symbol-
Tabelle sozusagen "global freigegeben wird" (wie das intern umschrieben wird, enzieht
sich leider meinem Wissen). my-Variablen werden wie ich jetzt festgestellt habe auch
in der Symbol-Table referenziert, aber man kann von ausserhalb des Moduls nicht darauf
zugreifen (entweder fremde Module können nicht auf den Modul-Stack zugreifen, oder intern
wird ein flag auf "restricted_to_module" gesetzt). Bei use vars qw(...) könnte ich mir
vorstellen, dass die Variablen nicht in den Stack gepushed werden, sondern als
"standalone" irgendwo im Speicher definiert sind und lediglich in der Symbol-Tabelle
referenziert sind, da sie so nie aus dem Scope geraten (vom Stack entfernt werden),
sind sie immer definiert und von überall her zugreifbar => global.
---
WARNUNG: Das sind einfach meine Gedanken dazu, ich habe keine verbindliche Basis
dafür.
Wer sich für die Internals interessiert:
perldoc perlguts
perldoc perlcall
perldoc perlapi
perldoc perlinternal
perldoc perlhack
...
ach, einfach perldoc perltoc!
OK, ich glaube ich sollte mich selber noch tiefer damit befassen :-)
Hoffe das war einigermassen verständlich, ist nämlich nicht einfach zu erklären :-)
Viele Grüsse
Philipp
RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.