Thread Geltungsbereiche (11 answers)
Opened by Kean at 2008-11-28 13:24

LanX-
 2008-11-28 15:54
#116693 #116693
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
hmm, diese Fragen kommen immer wieder auf weil 2 verscheidene Dimensionen von Perl durcheinandergeworfen werden.

1. Deklaration und Geltungsbereiche
2. Unterschied zw. Packagevariablen und lexikalischen Variablen.

Der Geltungsbereich ("scope") ist erstmal ein Codestück zwischen Deklarationsstelle und Ende des aktuellen Blocks (d.h. nächster schließenden Klammer der gleichen "Ebene"). Das aktuelle File ist der größtmögliche Geltungsbereich.

Deklarationen sind my und our die zum Compilierungszeitpunkt festlegen speicherbereiche den Variablennamen im scope zugewiesen werden. (local ist keine Deklaration!)

Speicherstellen sind hashähnliche interne Strukturen wo Perl seine Variableninhalte ablegt. Für Packages heißen diese stash (= Symbol Table haSH) für Blöcke (lex)pad.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# file

{ # code blockebene 1

   # code1 ebene1

   my $x; our $y;  # Anfang Geltungsbereich $x,$y in Ebene 1
 
  { 
   # code blockebene 2 

   package NEU;
   my $x; our $y;  # Anfang Geltungsbereich $x,$y in Ebene 2

   print $x; # $x in Lexpad 2
   print $y; # $y in Package "NEU", also $NEU::y;

   }# Ende Block2 und der Geltungsbereiche von $x,$y, und NEU
   our $z; # =$main::z; weil Geltungsbereich von package NEU verlassen.

} # Ende Geltungsbereich 1 $x,$y

#ende Geltungsgbereich file


was passiert mit deklarierten Variablennamen im Geltungsbereich?

1. by my $x wird gehört jedes $x im Geltungsbereich zum Lexpad des umfassenden Blockes
2. by our $y gehört jedes $y im Geltungsbereich zum Package zum Deklarationszeitpunkt, hier also ist $y= $main::y.

Der Befehl "package"unterliegt auch dem Blockscoping.

Neue Geltungsbereiche überschreiben lokal alte.

Bitte um Rückfragen bei Unklarheiten, bei Bedarf mach ich mal nen detaillierten TWiki-Artikel draus.

View full thread Geltungsbereiche