Halihallo
Wie krieg ich das hin, das meine Perl-Datenbank, auch Hashes of Hashes ordentlich speichert?
Leider gar net... Oder nur bedingt, mit eigenaufwand.
use DB_File;
tie %HASH, "DB_File", "db.file";
%HASH{key}=%hash2;
niet! %HASH{key} = %hash2;
sonst gibt's Datenmüll.
ist zwar schön und gut, aber wenn ich einem Wert einen anderen Hash zuordne, mag ihn die Datenbank nicht, Perl speichert nur, daß es sich um einen HASH handelt, was mir aber nichts nützt, ich will den Inhalt speichern...
Kann man mit dieser Datenbank nur eindimensionale Strukturen aufbauen?
AFAIK ja. Sonst musst du deinen eigenen TIE basteln, siehe hierzu:
perldoc perltie
Tipp:
sub STORE {
my ($self, $key, $value) = @_;
unless (@_ == 3) {
die "learn to tie!";
}
my $newvalue = $value;
if (ref($value) eq 'HASH') {
$newvalue = '';
while ( my ($n,$v) = each %{$value} ) {
$newvalue .= "$n&$v&";
}
chop $newvalue;
}
# same with array...
# scalars are not changed! - They're already OK...
# save $key => $newvalue in the DB_File
}
sub FETCH {
# achtung, $value von DB_File könnte ein Hash oder Array sein!
}
Zu deutsch: Wenn ein Key, Value - Paar abgespeichert werden soll, muss dieses auf den Referenztyp überprüft werden, ist dieser kein Skalar ("Normalfall"), dann wird der/das Hash/Array "skalarifiziert", d. h. aus der Hash-/Arrayreferenz wird ein Skalar gebildet, welcher dann durch DB_File gespeichert wird.
Beim auslesen von DB_File, müssen nun diese "skalarifizierten" Werte rücktransformiert werden (also wieder eine Hash-/Arrayreferenz zurückgeben).
Dies kannst du im Hauptprogramm machen, oder (wie im Beispiel) ein neues Tie-Modul erstellen, was auch Referenzen abbilden kann.
Viele Grüsse
Philipp