Thread static variable
(24 answers)
Opened by #Kein Kommentar at 2008-02-03 18:46 betterworld+2008-02-16 04:21:56-- Es ging mir darum Closures mit Packetvariablen zu simulieren und dann braucht man die Curlies. Natürlich kann man die Variablen direkt adressieren Code (perl): (dl
)
$raum::name aber mit our erspare ich mir das und kann bequem in einer Zeile mehrere Variabln aus verschiedenen Namensräumen mischen (was bei deinem Beispiel mit package nicht geht). betterworld+2008-02-16 04:21:56-- Mein Beispiel funktioniert auch ohne strict genau so, und ohne our überhaupt nicht. Wenn Perl auf eine Variable trifft sucht er nach der letzten vorhergehenden Deklaration im Scope um den Speicherraum der Variablen zu bestimmen. "Strict" ändert die "Defaultdeklaration" in eine Fehlermeldung, sodass ich nicht versehentlich eine undeklarierte Variable benutze. War die gefundene our-Deklaration in einem anderen Namensraum, dann auch die Variable! Ich finde das eine geniale Neuerung, weil das viel Schreibarbeit spart und das Scoping von "our" analog zu "my" ist. Zum Scoping habe ich etliche Experimente gemacht und Selfhtml-forum dokumentiert, leider kann ich das enstprechende Posting im Archiv nicht mehr finden... :-( EDIT: Ah jetzt ja -> Scoping und Variablenräume Konkret OO-technisch gesprochen Closures sind eine schnelle und billige Art Klassenmethoden/variablen zu realisieren, wenn man keine Objekte und Instanzvariable braucht. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 { #--- Deklaration der "Klassenvariablen" #- lexikalisch my ($lexical1,...); #- symboltabelle package Variablenraum; our ($pack1,...); #--- Deklaration der "Klassenmethoden" package Methodenraum; #normalerweise "main" sub Klassenmethode1 {} sub Klassenmethode2 {} ... } Natürlich sollte man im Zweifelsfall immer lexikalische bevorzugen. Der entscheidende Unterschied ist dabei die Kapselung, die Packagevariablen kann ich immernoch außerhalb des Blocks adressieren und manipulieren!!! TMTOWTDYOG (there's more than one way to dig your own grave)
|