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:

Zurück zum Anfang dieses Projekts.