Voriges Kapitel: Einführung in Perl
|
Perl-Variablen
|
Perl kennt drei Arten von Variablen:
$"
@"
%"
Im Gegensatz zu den meisten anderen Programmiersprachen unterscheidet Perl jedoch keine Datentypen. Variablen sind in der Lage Zahlen (sowohl Ganz- als auch Floatzahlen) oder Zeichenketten aufzunehmen. Variablen müssen vor ihrer Benutzung auch nicht deklariert werden. Die erste Benutzung einer Variablen erzeugt diese auch.
Skalare Variable erkennt man an einem "$" als erstem
Zeichen des Variablennamens. Das nächste Zeichen muß ein Buchstaben
sein. Der restliche Variablenname kann aus einer Mischung von Zeichen, Ziffern
und Unterstrichen bestehen. Wie bereits weiter oben erwähnt kann eine
solche Variable verschiedene Datentypen aufnehmen.
Die Variabel $var kann einmal eine Zahl ($var = 23;)
und kurz darauf im selben Programm eine Zeichenkette ($var =
"Perl";) aufnehmen. Wurde eine Zahl in Form einer Zeichenkette als
Variableninhalt erklärt
$var = "12";
kann damit sogar ohne weiteres gerechnet werden
print $var = $var * 2;
Diese Perlzeile führt zur Ausgabe der Zahl "24". Perl führt die Typkonvertierung zwischen Zahlen und Zeichenketten selbständig durch.
Die Umsätze eines Unternehmens im Verlauf eines Jahres stellen z.B. logisch zusammengehörige Werte dar.
Da Monate auch häufig mit Ziffern bezeichnet werden könnte man auch diese Liste also auch folgendermaßen schreiben:
Diese Liste besteht nun wie bereits weiter oben gesagt aus logisch zusammengehörigen und geordneten Werten. Die einzelnen Werte können einfach durchnummeriert werden, so dass der Zugriff über eine Indexnummer erfolgen kann.
Derartige Listen können in den meisten Programmiersprachen in Form von
"Feldern" oder "Arrays" zusammengefaßt werden. Alle Werte werden geordnet
in einem einzigen Feld abgelegt (Achtung: Nur die Werte werden abgelegt,
nicht die Indizes):
Zugriffs-Index Umsatz im
jeweiligen Monat
0 1 2 3 ...
0
200
250
300...
Wie skalare Variablen erhalten auch Felder eine Bezeichnung. Zur eindeutigen
Unterscheidung gegenüber einer skalaren Variablen ist das erste Zeichen
des Namens ein "@". Das obige Feld könnte also den
Namen @monatsumsatz tragen. Beachten sie aber den Startwert
der Indexspalte. Das erste Element eines Feldes hat immer die Indexnummer
"0". In diesem Beispiel ist diesem Umsatz der Wert "0" zugeordnet.
Der Zugriff auf einen einzelnen Feldwert erfolgt z.B. mit
$monatsumsatz[2] = $monatsumsatz[2] + 100;
und erhöht hier den Umsatz des Monats Februar um 100. Im Feldeintrag
ist nun der Wert "350" enthalten. Wie bei skalaren Variablen
erfolgt die Typkonvertierung automatisch, so dass diese Zahl auch in eine
Zeichenkette integriert werden kann.
print "Umsatz im Monat Februar ist : " . $monatsumsatz[2] . "DM";
und liefert hier die Ausgabe "Umsatz im Monat Februar ist: 350DM".
Mit Hilfe von Schleifen und Indexvariablen kann auch ein ganzes Array komfortabel bearbeitet werden:
for ($i = 1; $i <=12; $i = $i + 1){
$monatsumsatz[$i] = $monatsumsatz[$i] . " DM";
}
Das Feld sieht nun folgendermaßen aus:
Zugriffs-Index Umsatz im
jeweiligen Monat
0 1 2 3 ...
0
200 DM
350 DM
300 DM...
An jedes Feldelement wurde die Zeichenkette " DM" angehängt.
Wie skalare Variablen wird ein Feld beim ersten Zugriff erzeugt. Die Zeile
$array[0] = "Erster Wert";
generiert das Feld @array. Die Erweiterung des Feldes funktioniert
genauso. Im Gegensatz zu anderen Programmiersprachen müssen sie also
das Feld weder deklarieren noch seine Größe festlegen. Je nach
Bedarf wird es durch Perl dynamisch vergrößert.
Ein Feld kann in Perl jedoch auch ganz anders dargestellt werden. Stellen
Sie sich einfach vor sie schreiben alle Feldelemente, beginnend beim Ersten,
in einer Reihe hintereinander. Als Trennzeichen verwenden sie ein
",". Wenn der Feldwert eine Zahl ist, dann können sie ihn
schreiben wie er ist, handelt es sich um ein Zeichen oder um eine Zeichenkette,
so setzen sie den Wert in Anführungszeichen. Zuletzt klammern sie das
entstandene Gebilde mit runden Klammern ein. Unser bisheriges Beispiel
würde dann also folgendermaßen aussehen:
(0, "200 DM", "350 DM", "300 DM", ...)
Für Perl ist dies ebenfalls eine gültige Darstellung eines Felds (genaugenommen ein Feld ohne Namen => ein anonymes Feld). Damit läßt sich ein Feld aber auch anders initialisieren. Sie können somit zur Genrierung unseres Beispiel einfach die folgende Schreibweise verwenden:
@monatsumsatz = (0, "200 DM", "350 DM", "300 DM", ...);
Bei dieser Schreibweise handelt es sich einfach um eine Liste von Werten die in runden Klammern stehen. In Perl spricht man deshalb bei eindimensionalen Feldern auch häufig nur von Listen, bzw. von Listenvariablen. Das obige Beispiel war so gesehen die Zuweisung einer Liste an eine Listenvariable.
Genau diese Zuweisung läßt sich aber auch umdrehen:
( $keinmonat, $januar, $februar, $maerz, ...) = @monatsumsatz;
Auf beiden Seiten der Zuweisung steht jeweils eine Liste bzw. ein eindimensionales Feld.
@monatsumsatz ist nichts anderes als die
Schreibweise (0, "200 DM", "350 DM", "300 DM", ...).
Perl weist nun der Reihe nach jeweils einem Feldelement der linken Seite ein Feldelemten der rechten Seite zu. Würde man die dadurch automatisch entstehenden Zuweisungen einzeln aufschreiben, so sähe das so aus:
$keinmonat = $monatsumsatz[0];
$januar = $monatsumsatz[1];
$februar = $monatsumsatz[2];
$maerz = $monatsumsatz[3];
...
Der Begriff "assoziatives Array" beschreibt bereits die Funktionsweise dieser Datenstruktur. Da er den "Perl"-Profis aber zu unhandlich ist, wird im allgemeinen nur von einem Hash (sprich: "häsch") gesprochen. Zur Erklärung möchte ich zuerst nocheinmal die Struktur eines Lexikons in ihr Gedächtnis rufen da mir dieser Vergleich ziemlich treffend erscheint. In einem Lexikon wird jeweils einem Begriff eine Erklärung zugeordnet.
| Auszug aus einem Fremdwörterbuch: | |
| Aspis(schlange), | die: afrikanische Brillenschlange |
| Assignate, | die: (fr.) -/-n: fr. Banknote (1790 ausgegeben, 1796 als wertlos gewordenes Papiergeld außer Kurs gesetzt). |
| assoziativ | Bw. durch Verbindung bzw. Verknüpfung von Sinneseindrücken bewirkt, bzw. sie hervorrufend. |
Die erste Spalte ist eine Art Schlüsselwort dessen Erklärung gesucht wird. Um die zugehörige Erklärung zu finden, muß man dieses Schlüsselwort kennen und im Lexikon auffinden. Da die Schlüsselwörter alphabetisch angeordnet sind, ist das normalerweise kein Problem. Anschließend wird in der zweiten Spalte die Erklärung nachgelesen.
Den gesamten Vorgang könnte man sich als Programmierer auch als eine
Funktion lexikon() vorstellen. Dieser Funktion wird ein
Schlüsselwort übergeben und nach kurzer Verarbeitungsdauer erhält
man die Erklärung als Ergebnis. Als Code-Zeile eines Programms würde
das dann so aussehen:
erklaerung = lexikon("assoziativ");
Die Variable erklaerung enthält nach der Abarbeitung der
Programmzeile den Erklärungstext aus dem obigen Lexikon.
Ein Hash funktioniert prinzipiell genau gleich. Sie können es sich auch als zweispaltiges Gebilde vorstellen in dem die erste Spalte die "Schlüssel" enthält und die zweite Spalte die dem Schlüssel zugeordneten (assoziierten) Werte. Nachfolgend ein Hashbeispiel bei dem jeweils einem Nachname ein Vorname zugeordnet wird:
|
Spalte 1: Schlüsselspalte |
Spalte 2: Assoziierte Werte |
Reisser
|
Fritz
|
Meier
|
Paul
|
Der Hash %name
Im Gegensatz zu einem Lexikon sind jedoch die Schlüssel nicht geordnet.
Dies ist aber auch nicht notwendig da Perl das Auffinden der richtigen Hashzeile
selbst übernimmt. Ähnlich wie bei der obigen Funktion
lexikon() kann damit ganz schnell auf den zu einem Schlüssel
zugeordneten Wert zugegriffen werden.
Zur Unterscheidung von skalaren (eindimensionalen) bzw. Listenvariablen beginnen
Hashnamen mit einem führenden "%"-Zeichen. Der obige Hash
könnte somit die Bezeichnung %name haben. Wenn sie jedoch
einen Zugriff auf einen einzelnen Hashwert ausführen, müssen sie
wieder mit dem "$"-Syntax der skalaren Variablen arbeiten (ein
einzelner Hashwert ist eine skalare Größe). Der Syntax für
eine Hash-Zugriff sieht also folgendermaßen aus:
$vorname = $name{"Reisser"};
Die Variable $vorname hat nach dieser Zuweisung den Wert
"Fritz".
Auf die gleiche Weise können sie auch einen Wert in den Hash einfügen:
$name{"Meroth"} = "Michael";
Der Hash wird damit um eine "Zeile" erweitert.
|
Spalte 1: Schlüsselspalte |
Spalte 2: Assoziierte Werte |
Reisser
|
Fritz
|
Meier
|
Paul
|
Meroth
|
Michael
|
Beachten sie aber, daß die Schlüsselspalte eindeutig ist. Es kann keine zwei Zeilen mit identischem Eintrag im Schlüsselfeld geben. Falls sie also versuchen sollten unserem Hash noch einen "Roland Meier" hinzuzufügen, so wird der bereits bestehende Hash-Eintrag verändert.
$name{"Meier"} = "Roland";
Der dem Schlüssel "Meier" zugeordnete Wert
"Paul" wird auf "Roland" geändert.
|
Spalte 1: Schlüsselspalte |
Spalte 2: Assoziierte Werte |
Reisser
|
Fritz
|
Meier
|
Roland
|
Meroth
|
Michael
|
Voriges Kapitel: Einführung in Perl
Lokal bzw.
Remote-Zugriffe seit dem 17. September 2000