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.