Philipp Hasenfratz: Argumentation etwas verbessert.

Beitrag lesen

Halihallo nochmals

Das die lokale Variablen eine hörere "Priorität" haben ist eigentlich logisch. Perl
greift zuerst auf den Stack zu, falls dort keine Variable gefunden wird, ist die
Symbol-Tabelle (also jetzt doch die Referenzierung aller "Modulvariablen") ein
Fall-Back.

Das war nur der Vollständigkeits-halber, das dürfte ja jedem Bekannt sein.

BEGIN {$test::test = 'test';}
abaendert. Dann wird im print-Statement 'test' ausgegeben, da die Variable dann schon eher exisitert und nicht mehr auto-vivified wird. Aber muesste das BEGIN nicht eher als das my-Statement ausgefuehrt werden und daher auf die Modul-Variable $test::test zugreifen (und dabei abgebrochen werden, weil es gegen use strict verstoesst)?

zweiter Versuch:
Die Definition und die Iniziierung sind zwei Prozesse. Erstere geschieht zur
Compiletime (und zwar _vor_ dem Ausführen von BEGIN, dieses schliesst die Compilier-
Phase einfach ab), letzteres zur Laufzeit (das gilt zwar auch bei lokalen Variablen
innerhalb von Prozeduren, jedoch werden dort die Variablen nicht erstellt, da deren
Existenz vom Aufruf der Prozedur abhängig sind). Wird eine lokale Variable (im Modul-
Scope; also nicht blockscoped) definiert, wird diese zur Compiletime mit undef
definiert. Bei my $test=5; ist $test zur Compiletime undef (und könnte somit in BEGIN
geändert werden), zur Laufzeit nach der Definition '5'.

Beispiel:
use strict;
my $test = 5;
print "$test";
BEGIN {
   $test = 7;
   print "$test,";
}
1;

gibt "7,5" aus. Da $test vor BEGIN deklariert wird, greift $test=7 in BEGIN auf die
zur Compiletime definierte (aber nicht iniziierte) Variable zu, setzt diese auf 7 und
gibt somit 7 aus. Nach BEGIN wird dieselbe Variable $test zur Laufzeit auf 5 gesetzt und
somit wird anschliessend 5 ausgegeben.

Das ist zumindest meine Erklärung für dieses "Phenomen".

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/>.