DB_File und tie %HASH
alex
- perl
Howdy
Wie krieg ich das hin, das meine Perl-Datenbank, auch Hashes of Hashes ordentlich speichert?
use DB_File;
tie %HASH, "DB_File", "db.file";
%HASH{key}=%hash2;
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?
bye,
alex
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
use Mosche;
Wie krieg ich das hin, das meine Perl-Datenbank, auch Hashes of Hashes ordentlich speichert?
Leider gar net... Oder nur bedingt, mit eigenaufwand.
Ich empfehle zu diesem Thema das Buch "Programmierung mit Perl DBI" (O'Reilly), welches ein eigenes Kapitel Persistenz-Lösungen für solche Probleme widmet (als Beispiel seien hier genannt Data::Dumper, Storable, ...).
use Tschoe qw(Matti);
Ich empfehle zu diesem Thema das Buch "Programmierung mit Perl DBI" (O'Reilly), welches ein eigenes Kapitel Persistenz-Lösungen für solche Probleme widmet (als Beispiel seien hier genannt Data::Dumper, Storable, ...).
OK, danke. Ich habe es mir heute in der Bibo vorgemerkt.
Ich finde sowieso, daß ne Menge guter Bücher aus dem Hause O'Reilly stammen. Mal sehen, was mir dieses rät...
cu
alex
Halihallo Alex
OK, danke. Ich habe es mir heute in der Bibo vorgemerkt.
Ich finde sowieso, daß ne Menge guter Bücher aus dem Hause O'Reilly stammen. Mal sehen, was mir dieses rät...
Exactly! - Darf ich dir noch folgendes empfehlen:
O'Relly Perl Cookbook. ISBN: 1-56592-243-3
wirklich ein guter Helfer!!!
Viele Grüsse
Philipp