Webbasierte Adressdatenbank
Zerlegen von Datensäzen
Nachdem wir gesehen haben, wie Filehandles benutzt werden, wollen wir nun Daten
von der Tastatur einlesen und in ein File schreiben. Danach werden wir die Daten aus dem File wieder hervorzaubern,
sortieren und ausgeben.
Beispiel write1.pl:
1: #!/usr/bin/perl -w 2: 3: use strict; 4: 5: my $file = "daten.dat"; 6: my $eingabe; 7: 8: chomp ($eingabe = <STDIN>); 9: 10: open (FILE, ">$file") 11: || die "Kann File $file nicht öffnen: $!"; # File zum Schreiben öffnen 12: 13: while ($eingabe ne "999") { 14: print FILE $eingabe."\n"; 15: chomp ($eingabe = <STDIN>); 16: } 17: 18: close (FILE) || die "Kann File $file nicht schließen: $!";
In Zeile 8 lesen wir die erste Eingabe von der Tastatur und entfernen den Zeilenvorschub. In Zeile 10 öffnen wir die Datei zum Schreiben,
dabei wird die Datei neu erstellt. Die Bedingung der while
Schleife, prüft, ob
$eingabe
ungleich 999 (als String) ist, wenn ja schreiben wir in das File mit Zeilenvorschub und lesen eine
neue Eingabe von der Tastatur. Um zu sehen was im Datenfile steht verwenden wir
Beispiel read1.pl:
1: #!/usr/bin/perl -w 2: 3: use strict; 4: 5: my $file = "daten.dat"; 6: 7: open (FILE, "<$file") 8: || die "Kann File $file nicht öffnen: $!"; # File zum Lesen öffnen 9: 10: while (<FILE>) { 11: chomp; 12: print $_."\n"; 13: } 14: 15: close (FILE) || die "Kann File $file nicht schließen: $!";
Wie's funktioniert ist im Prinzip im Kapitel Filehandles beschrieben. Als nächsten Schritt wollen wir die Daten in ein Array einlesen und alphabetisch sortiert ausgeben.
Beispiel read2.pl:
1: #!/usr/bin/perl -w 2: 3: use strict; 4: 5: my $file = "daten.dat"; 6: my (@array, @sortet); 7: 8: open (FILE, "<$file") 9: || die "Kann File $file nicht öffnen: $!"; # File zum Lesen öffnen 10: 11: while (<FILE>) { 12: chomp; # einlesen in $_ und Zeilenvorschub entfernen 13: push (@array, $_); 14: } 15: 16: @sortet = sort { $a cmp $b } @array; 17: 18: foreach (@sortet) { 19: print $_."\n"; 20: } 21: 22: close (FILE) || die "Kann File $file nicht schließen: $!";
Im Gegensatz zum Beispiel read1.pl lesen wird hier die Daten in ein Array ein. Dazu hägen wir jedes neu
eingelesene Elemet mit push
rechts an die Liste @array
an
(vergleiche auch Arrays im Vortrag Einfürung in Perl).
Der Befehl sort
sortiert, wie der Name schon sagt ein Array. Mit cmp
wird alphabetisch sortiert
(vergleiche auch Operatoren im Vortrag Einfürung in Perl).
In unserer geplanten Adressdatenbank, wird aber eine Adresse in einer Zeile des Datenfiles stehen.
Wie man ein Array mit Trennzeichen versieht und in ein File schreibt zeigt uns
Beispiel write2.pl
1: #!/usr/bin/perl -w 2: 3: use strict; 4: 5: my $file = "daten.dat"; 6: my ($eingabe, $string); 7: my @array =(); # leeres Array definieren 8: 9: chomp ($eingabe = <STDIN>); 10: 11: while ($eingabe ne "999") { 12: push @array, $eingabe; #Eingabe an Array anhängen 13: chomp ($eingabe = <STDIN>); 14: } 15: 16: $string = join '|', @array ; #String aus Liste mit | als Trennzeichen 17: 18: open (FILE, ">$file") 19: || die "Kann File $file nicht öffnen: $!"; # File zum Schreiben öffnen 20: 21: print FILE $string."\n"; 22: 23: close (FILE) || die "Kann File $file nicht schließen: $!";
In Zeile 16 basteln wir aus den einzelnen Arrayelementen und einem Trennzeichen einen String der Art:
"Element1|Element2|Element3". Dies erledigt join AUSDR, Liste
.
Der "AUSDR" gibt das Trennzeichen an, die Elemente stehen in der "Liste".
Der umgekehrte Befehl lautet
@array = split /Muster/, String
, Wobei das /Muster/
für
einen regulären Ausdruck steht, der dem Trennzeichen entspricht. Wird kein String angegeben,
verwendet split
automatisch die Standardvariable $_
Beispiel read3.pl
1: #!/usr/bin/perl -w 2: 3: use strict; 4: 5: my $file = "daten.dat"; 6: my (@array, @sortet, $string); 7: 8: open (FILE, "<$file") 9: || die "Kann File $file nicht öffnen: $!"; # File zum Lesen öffnen 10: 11: while (<FILE>) { 12: chomp; # einlesen und Zeilenvorschub entfernen 13: @array = split /\|/; # an | auftrennen 14: } 15: 16: close (FILE) || die "Kann File $file nicht schließen: $!"; 17: 18: @sortet = sort { $a cmp $b } @array; 19: 20: foreach (@sortet) { 21: print $_."\n"; 22: }
Beim Auftrennen des Datensatzes in Zeile 13 gilt eigentlich nur zu beachten das |
ein Metazeichen ist und deshalb mit einem Backslash geschützt werden muß. Um nun eine Adressdatenbank
zu erstellen müsen wir uns erst noch mit komplexen Datenstrukturen befassen.
Literaturhinweise:
- perldoc perlfunc
Zurück zum Anfang dieses Projekts.