Hell-O!
Heißt dies, dass dann im BEGIN-Block noch gar keine Vaiablen des rufenden Skripts angesprochen werden können ?
Ja, BEGIN-Blöcke werden *vor* der Kompilierung des verbleibenden Scripts ausgeführt, deshalb sind ihm von Haus aus keinerlei Variablen bekannt. Du musst halt zwischen Kompilierung und Ausführung des Scripts unterscheiden. BEGIN-Blöcke werden während der Kompilierung des Scripts ausgeführt und sind danach Geschichte. Daher kann man auch keine Variablen, die im BEGIN-Block deklariert wurden, unter dem strict-Pragma außerhalb dieses Blockes - also während des Ausführens des Scripts - aufrufen, ohne ihre Gültigkeit zur Laufzeit explizit festzulegen.
Mal ein paar Beispiele:
use strict;
use CGI qw/param/;
BEGIN {
$boo = param('foo');
}
print $boo;
Das wird nicht funktionieren. Zwar wird $boo innerhalb des BEGIN-Blocks deklariert, steht während der Ausführung aber nicht zur Verfügung.
use strict;
use CGI qw/param/;
BEGIN {
sub return_boo { my $boo = param('foo'); }
}
print return_boo();
Das funktioniert, da u.a. das Deklarieren von Subroutinen - ggf. aus anderen Packages - zu den Aufgaben eines BEGIN-Blocks gehört.
Und schließlich noch die letzte Variante:
use strict;
use CGI qw/param/;
my $boo;
BEGIN {
$boo = param('foo');
}
print $boo;
Diese Variante funktioniert auch und kommt dem Grundprinzip des von dir verwendeten Scripts m.E. am nächsten. Die Variable $boo wird zweimal deklariert, nämlich während des Kompilierens im BEGIN-Block (wichtig: Ohne my oder our) und während der Ausführung via my $boo;. Dadurch erhältst du zur Laufzeit Zugriff auf den Inhalt der Variablen, den sie während der Kompilierungsphase erhalten hat. Würdest du es so schreiben:
use strict;
use CGI qw/param/;
my $boo = "";
BEGIN {
$boo = param('foo');
}
print $boo;
weist du der Variablen einen Leerstring zu und überschreibst damit den Wert, den sie während der Kompilierungsphase im BEGIN-Block erhalten hat.
Ich hoffe, ein kleines bisschen Licht ins Dunkel gebracht zu haben :-)
Siechfred