<< Reguläre Ausdrücke II | Inhalt | Mehrdimensionale Arrays >> |
Bis jetzt haben wir einige Variablen kennengelernt: skalare Variablen, Arrays und Hashes. Man kann nun auch mit sogenannten Referenzen auf Variablen arbeiten!
Unter einer Referenz kann man sich einen Art Verweis auf ein "Element" aus Perl vorstellen. Es gibt Referenzen auf skalare Variablen, Arrays, Hashes, Funktionen, ... Erzeugt man eine Referenz auf ein Element, so hat man eine zweite Variable (die Referenz), die auf den Inhalt der ursprünglichen Variablen zeigt.
Die einfachste Art eine Referenz zu erzeugen, arbeitet über den Operator \ - den sog. Referenzoperator:
Bleiben wir bei den Beispielen von oben. $refBegr zeigt jetzt auf $begr. Auf den Inhalt der Variablen greift man ganz einfach zu: Man schreibt vor die Referenzvariable und dem $-Zeichen ein weiteres $-Zeichen bei skalaren Variablen. Bei Arrays ist es eben ein @-Zeichen, bei einem Hash ein %-Zeichen und bei einer Funktion ein &-Zeichen.
Ergibt:
Gar nicht so schwer oder ... ? Die Sache mit dem Zugriff auf den Inhalt über die Referenz nennt man auch Dereferenzierung. Man muss zuerst dereferenzieren (also $, %, etc. vor die Referenz schreiben), um auf den Inhalt zugreifen zu können.
Man kann den Inhalt einer Variable auch über Referenzen manipulieren - also verändern:
Neben obiger Dereferenzierung (Syntax bei skalaren Variablen) gibt es auch noch zwei weitere Möglichkeiten zur Dereferenzierung: Zum einen ist da die kanonische Syntax der Form Zeichen{Referenz} - zum Beispiel ${$refBegr} und zum anderen die Pfeilsyntax, die nur bei Hash- und Arrayvariablen möglich ist. Letztere hat die Form: $Referenz->{key} bzw. $Referenz->[Index] - zum Beispiel $colors->{rot} oder $z->[2].
Die kanonische Syntax unterscheidet sich von der ersten Syntax nur von der Einklammerung der Referenz! Das heißt im Grunde kann man mit dieser Schreibweise genauso arbeiten wie oben. Zusätzlich ist jedoch erlaubt zwischen den beiden Klammern Perlcode zu erzeugen. Es muss nur die erwartete Referenz zurückgeliefert werden. Ein Beispiel zur Verdeutlichung:
Naja wir wissen was Referenzen sind - aber wozu kann man diese brauchen? Ein Einsatzgebiet sind Funktionsaufrufe. Will man innerhalb eines Funktionsaufrus Daten ändern, und die geänderten Daten sollen sich auf das Hauptprogramm auswirken, so ist es sinnvoll mit Referenzen zu arbeiten (call-by-reference). Der Umweg über Paramterübergabe und Rückgabe ist umständlich und langsamer. Hier einige Beispiele um dies zu verdeutlichen:
Einer Referenz wird nicht nur die Adresse zugewiesen - Perlreferenzen enthalten auch den Typ des Inhalts, auf den sie zeigen. Der Operator ref() gibt den Typ der Referenz zurück:
Bis jetzt kennen wir nur Referenzen, die auf existierende Variablen zeigen. Wird eine Referenz auf eine nichtexistierende Variable erzeugt, so wird Letztere erzeugt. Dies nennt man eine symbolische Referenz:
Bis jetzt kennen wir Referenzen auf explizit existierende Funktionen (\&Funtkion). Dann kann man diese Funktion auch ganz normal aufrufen. Will man das aber nur mit Referenz machen, so kann man einer Referenz den gesamten Code der Funktion zuweisen - dies nannt man dann eine anonyme Funktion:
Anonyme Arrays sind Arrays ohne Variablennamen - man kann nur mit Hilfe einer Referenz auf dieses Array zugereifen. Erzeugt wird ein solches Array analog zu einem ganz normalen Array - der einzige Unterschied ist das Verwenden von eckigen Klammern statt der runden:
Es existiert also keine Variable @irgendwas, sondern nur eine Referenz auf die Daten!
Und Folgendes funktioniert auch:
Analog zu den anonymen Arrays verfährt man mit anonymen Hashes - statt der eckigen Klammern benutzt man jedoch geschweifte:
Auch hier existiert keine Variable, sondern nur eine Referenz auf die Daten!
<< Reguläre Ausdrücke II | Inhalt | Mehrdimensionale Arrays >> |
© 2001-2003 Perl, Lehrstuhl Mathe II, Uni Bayreuth |