2010-11-27 2 views
1

Nach dem dbmopen-Doku wurde diese Funktion weitgehend durch die "tie" -Funktion ersetzt. Ich kenne das Tie :: File-Modul, das über ein Perl-Array auf die Zeilen einer Disk-Datei zugreift. Wie würde ich es tun, wenn ich kein Array sondern ein Hash benötige?Der beste Weg, um einen Hash in eine Datei zu schreiben

+2

Dies hängt ganz davon ab, was Sie erreichen möchten und wie viele Daten gespeichert werden. Können Sie weitere Informationen hinzufügen? – Ether

+0

Ich wäre eine Alternative zu (dem ersetzten) dbmopen. In diesem Fall sind es nicht viele Daten. –

+1

Mit Informationen meinte sie: Was für Informationen? Wie wird es benutzt? Wie viel genau? Gibt es irgendwelche Einschränkungen? – Mithaldu

Antwort

4

können Sie Storable verwenden:

use Storable; 
store \%hash, 'file'; 
my $hashref = retrieve('file'); 

oder, wenn Sie mehr Daten speichern, müssen dann BerkeleyDB:

use BerkeleyDB; 
use MLDBM qw(BerkeleyDB::Hash) ; 
use Storable; 


my $env = BerkeleyDB::Env->new(-Home => $home); 
tie %store, 'MLDBM', -env => $env; 

$store{my_stored_hash} = \%hash; 
+0

"Verwendung speicherbar" Link ist kaputt. Perl Leute änderten es zu diesem: http://perldoc.perl.org/Storable.html – con

-9

Um einen Hash-Datei zu schreiben:

open(OUT,">myFile.txt"); 

foreach my $key (sort keys %hash) { 
    print OUT $key.",".$hash{$key}."\n"; 
} 
close(OUT); 
+3

Bitte verwenden Sie keine Bareword-Dateihandles, niemals. Sie sind ein Risiko für die Sicherheit und Stabilität Ihrer Software und verbreiten sie für Neulinge überall auf der Welt. Ich werde meine Bewertung umkehren, sobald Sie die Änderung vorgenommen haben, stattdessen skalare Dateihandles zu verwenden. – Mithaldu

+3

Das funktioniert, bis einer Ihrer Schlüssel ein Komma enthält. Und es hat normalerweise wenig Sinn, den Hash zu sortieren - benutze jeden, es sei denn, es ist wirklich wichtig. – Porculus

+0

@Mithaldu, ich werde keinen Code ändern. Wenn Sie ein missionskritisches Kernkraftwerk entwerfen (es ist unwahrscheinlich, dass Sie Perl verwenden, da es von einem sehr talentierten Enthusiasten abhängt), kann ich Ihren Standpunkt sehen. Wenn Sie ein Stück Perl schreiben, um eine Arbeit so schnell wie möglich zu erledigen, sehe ich nicht, was das Problem ist. Wie auch immer, ich habe nie behauptet, eine vollständige Antwort zu geben - nur ein Hinweis darauf, wie man etwas tun könnte. Deshalb bist du neg rep ist erbärmlich. Ich fordere Sie auf, eine bessere Antwort zu geben. – Eamorr

1

Blick auf die Standard-AnyDBM_File Modul und die andere Dokumentation verweist darauf, für einige Beispiele von tie statt dbmopen verwenden.

2

Der Core-Modul SDBM_File einen Hash in eine Datei binden könnte:

use Fcntl; 
use SDBM_File; 

tie(%h, 'SDBM_File', 'filename', O_RDWR|O_CREAT, 0666) or die $!; 
... 
... 
untie %h; 

Aber: "... die Länge eines Schlüssels, plus die Länge seiner Assoziation Ed-Wert darf 1008 Bytes nicht überschreiten. "

Verwandte Themen