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