Grundsätzlicher Aufbau
foreach (Anweisungsblock) {
Ausführung der Anweisungen...
}
Dies Schleife gibt die Zeile "Ausgabe der Daten $zaehler" soviele male aus wie im Bereich 1..$wert angegeben.
Deshalb nennt man den .. auch Bereichsoperator.
foreach $zaehler (1..$wert) {
print "Ausgabe der Daten $zaehler\n";
}
Beispiel 1, eine Texdatenbank auslesen
Daten werden oftmals in einem solchen Format gespeichert:
Name|Vorname|Telefon
Name|Vorname|Telefon
Name|Vorname|Telefon
...weitere Zeilen
Die Aufgabe besteht nun darin diese Datei auszulesen und das Array von Daten aufzusplitten und auszugeben.
open (DAT,"<daten.dat") or scripterror("Fehler: Kann daten.dat nicht oeffnen!",$!);
flock (DAT, 2);
@DATEI=<DAT>;
close (DAT);
print "<table border=\"1\">";
foreach $linien (@DATEI){
chomp($linien);
($name,$vorname,$telefon)=split(/\|/,$linien);
print "<tr><td>$name</td><td>$vorname</td><td>$telefon</td></tr>\n";
}
print "</table>";
Erläuterungen dazu:
foreach $linien (@DATEI){ Hier wird der Anweisungsblock definiert, also das was foreach tun soll.
In dem Fall ist es so das hier alle Linien des Datei Arrays @DATEI durchlaufen werden sollen.
chomp($linien); chomp (engl. nagen) nimmt von jeder Linie das \n am Ende weg.
($name,$vorname,$telefon)=split(/\|/,$linien); Nun folgt das splitten der Linien in die einzelnen Bestandteile.
print "<tr><td>$name</td><td>$vorname</td><td>$telefon</td></tr>\n";
Diese Zeile "printet" dann die Inhalte der Datei in eine Tabellenzeile aus
} beendet die Schleife
Beispiel 2, eine Texdatenbank umsortieren und Zeilennumern einfügen
Manchmal kann man ja in die Verlegenheit kommen einen Datensatz von einem Script zu einem anderen zu portieren.
Ist hier die Datenstruktur eine andere muss man nicht mit Stundenlanger Handarbeit die Dateien ändern.
Im folgenden Beispiel ist die Aufgabe den Datensatz von Beispiel 1 fortlaufend zu nummerieren und den Name an das Zeilenende zu stellen.
Vorher:
Name|Vorname|Telefon
Name|Vorname|Telefon
Name|Vorname|Telefon
...weitere Zeilen
Nacher:
1|Vorname|Telefon|Name
2|Vorname|Telefon|Name
3|Vorname|Telefon|Name
...weitere Zeilen
Das dazu nötige Script
open(F,"<daten.dat") or scripterror("Fehler: Kann daten.dat nicht oeffnen!",$!);
@linie=<F>;
close (F);
$total = 0;
foreach $i (@linie) {
chomp($i);
($aa,$bb,$cc) = split(/\|/,$i);
$total++;
open(FI,">>daten1.dat") or scripterror("Fehler: Kann daten.dat nicht oeffnen!",$!);
print FI "$total|$bb|$cc|$aa\n";
close (FI);
}
|