
perl
Einfache Perl Variablen kennen wir bereits, heute lernen wir "arrays".
Weiters hat Perl sehr viele Funktionen zum Manipulieren von textstrings
eingebaut. Davon lernen wir heute "split" und "join" kennen.
Angenommen wir haben eine grosse Zahl von Daten die wir speichern wollen.
Wir könnten natürlich
$name1="bla";
$name2="bli";
...
$name20="blo";
machen. Das ist aber nicht gerade ideal. Daten die wir über einen index
ansprechen wollen fasst man am besten in ein array zusammen:
z.B. folgendes Programm:
#!/usr/bin/perl -w
@feld=();
$feld[2]="toni";
$feld[1]="anna";
$feld[3]="susi";
$feld[0]="karli";
push @feld,"franzi";
foreach $name (@feld) {
print "name=$name
";
}
@feld=(); definiert unser array und weist als Inhalt das leere array
() zu. Danach werden die 4 Felder des array durch Zuweisungen mit namen
befüllt. Der push befehl hängt an das Ende des array noch einen wert an.
(in diesem Falle wäre das equivalent mit $feld[5]="franzi".)
Man beachte: meint man das array als Ganzes so schreibt man ein @ vor dem
Namen. Meint man ein einzelnes Feld so schreibt man $ und
dahinter dann eckige Klammern und in den ekigen Klammern den
index.
die foreach Schleife ist eine praktische Methode wenn man über alle
Elemente eines arrays iteriren will. Die foreach schleife weist der
Variablen $name alle Werte aus dem array zu das in Klammern dahinter
steht (gibt man bei foreach keine variable an der die Werte zugewiesen
werden sollen so wird dafür $_ verwendet)
Will man bei einem array herausfinden wie hoch der index des letzten
befüllten Elements ist so kann man das mit dem Ausdruch $#feld
Wir könnten also anstelle obiger foreach Schleife auch eine for Schleife
machen und mitzählen:
for($i=0 ; $i <= $#feld ; $i++) {
print "der name ist " , $feld[$i] , " n";
}
Wo push am ende eines arrays einen wert anfügt nimmt die funktion pop
einen weg:
while ($k=pop @feld) {
print "name ist $k";
}
Obige Schleife gibt damit die Namen in verkehrter Reihenfolge aus und
löscht das array weil pop ja die emlemente der Reihe nach entfernt. Der
Wert $k ist undefiniert sobald versucht wird vom leeren array nochmal
etwas wegzu-pop-en und damit wird die whileschleife beendet.
Ähnlich wie pop arbeitet der Befehl "shift", aber shift nimmt die Elemente
vom Anfang des array weg.
$name=shift @feld;
weist der Variablen $name den Wert von $feld[0] zu und nummeriert das
array um so das $feld[1] an die Stelle von $feld[0] rückt usw...
das Gegenteil zu shift ist "unshift". Es fügt einen Wert am Anfang des
arrays ein und verschiebt alle Werte um eins nach hinten.
Zum Abschluss lesen wir alle Zeilen von STDIN ein und geben sie in
verkehrter Reihenfolge versehen mit der index Nummer wieder aus:
#!/usr/bin/perl -w
@a=();
while() {
push @a,$_;
}
for($i=$#a ; $i >=0 ; $i-- ) {
print "$i: ",$a[$i];
}
Man beachte: da wir kein chomp machen sind in den Zeilen noch die " n"
mitabgespeichert und wir brauchen beim Ausgeben auch kein zusätzliches
anfügen. eleganter wäre obiges programm natürlich mit einer while
Schleife und einem pop.
Ausserdem könnte man den Befehl: reverse verwenden der die Reihenfolge in
einem array umkehrt.
@verkehrt=reverse @glatt;
Ein spezielles array ist das array mit dem Namen @ARGV. es enthält alle
Parameter die dem Programm beim Aufruf übergeben wurden.
EXERCISES:
* schreibe ein Perl script das alle Zeilen von STDIN in ein array einliest
und danach wieder ausgibt. Mach die Ausgabeschleife einmal mit einem
foreach, einmal mit einem for das über alle Indexnummern läuft und
einmal mit einer while Schleife die mit shift ein Element nach dem
anderen herunterliest.
* schreibe ein Perl script das alle Parameter mit denen es aufgerufen
wurde nacheinander ausgibt.
REFERENCES:
man perldata
man perlfunc
|