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