AlexBausW: Wieder mal ne Textdatenbank

Beitrag lesen

Hi Speedy,

FELD1,FELD2,FELD3,FELD4...
WERT1.1,WERT2.1,WERT3.1,WERT4.1...
WERT1.2,WERT2.2,WERT3.2,WERT4.2...

Ich hab` mal ein kleines Modul geschrieben (nicht um das Rad neu zu erfinden, sondern um was zu lernen [über Hash of Hashes und Referenzen] ;-), daß solche Textdatenbanken handelt.
Hier mal die entscheidenden Zeilen (ein bischen umgeschrieben, da ich bei mir mehrere Subroutinen und Referenzen verwende):

@attribute = split /$delim/, <LINES>; #   $delim enthält den Delimiter
chomp $attribute[-1];

foreach $attribut (@attribute) {
   # primkey enthält die Bezeichnung des Attributs, das als Primärschlüssel dient.  
   last if $attribut eq $primkey;
   # enthält Position des Primärykeys innerhalb des durch Delimiter getrennten Datensatzes
   $$position++;
}

while(<LINES>) {
   my $fieldnum = 0;
   @record = split /$delim/; # spaltet Zeile in die Felder des Datensatzes auf
   chomp $record[-1];
   foreach $value (@record) {
      # HoH konstruieren:
      # Hash = ( 'Primarykey1' => { 'Attribut1' => 'Wert1',
      #                             'Attribut2' => 'Wert2' }
      #          'Primarykey2' => { 'Attribut1' => 'Wert1',
      #                             'Attribut2' => 'Wert2' }  );
      $relation{$record[$position]}->{$attribute[$fieldnum++]} = $value;
   }
}

Aus der Subroutine, die die Datensätze eingelesen hat, habe ich %relation als Referenz zurückgegeben:
mit $db{$file} = &dbread($file);
    sub &dbread  { [....] return  %relation; }
bekomme ich dann eine Datenstruktur, die sich mit:
    # Primärschlüsselwert kennzeichnet bestimmten Datensatz
    $value =  $db{$file}->{'Primärschlüsselwert'}->{'Attribut'};
dereferenzieren lässt.

Ich hoffe das funktioniert trotz Umschreibens noch einigermaßen (hätte auch vermutlich auch nix gepostet, wenn`s nicht bei mir so ähnlich herumfliegen würde ;-)
Das Drumherum musst Du natürlich noch ergänzen ;-)

Gruß AlexBausW