Siechfred: BEGIN-Blöcke, Zugriff auf Variablen, strict-Pragma

Beitrag lesen

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

--
Hier könnte Ihre Werbung stehen.
Dark Millennium || Die neue 1%-Regelung