2010-11-27 6 views
1

Selon le dbmopen-docu, cette fonction a été largement remplacée par la fonction "tie". Je connais le module Tie :: File qui accède aux lignes d'un fichier disque via un tableau Perl. Comment le ferais-je si je n'ai pas besoin d'un tableau mais d'un hachage?Meilleure façon d'écrire un hachage dans un fichier

+2

Cela dépend entièrement de ce que vous voulez réaliser et de la quantité de données stockées. Pouvez-vous ajouter d'autres informations? – Ether

+0

Je serais une alternative à (le remplacé) dbmopen. Dans ce cas, ce n'est pas beaucoup de données. –

+1

Par information, elle voulait dire: Quel genre d'information? Comment est-ce utilisé? Combien exactement? Y a-t-il des contraintes? – Mithaldu

Répondre

4

Vous pouvez utiliser Storable:

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

ou si vous avez besoin de stocker plus de données puis 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

Le lien "use Storable" est cassé. Les gens de Perl l'ont changé: http://perldoc.perl.org/Storable.html – con

-9

Pour écrire un hachage fichier:

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

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

Veuillez ne pas utiliser les poignées de fichiers bareword, jamais. Ils constituent un risque pour la sécurité et la stabilité de votre logiciel et leur diffusion aux débutants diminue la qualité de perl partout. J'inverserai mon vote une fois que vous aurez fait la modification pour utiliser les descripteurs de fichiers scalaires à la place. – Mithaldu

+3

Ce qui fonctionne bien jusqu'à ce qu'une de vos clés ait une virgule dedans. Et il est généralement inutile de trier le hash - il suffit d'utiliser chacun sauf si cela compte vraiment. – Porculus

+0

@Mithaldu, je ne vais pas changer de code. Si vous êtes en train de concevoir une centrale nucléaire d'une importance vitale (peu probable que vous utilisiez Perl car cela dépend totalement d'un gars, un passionné très talentueux), je peux voir ce que vous voulez dire. Si vous écrivez un morceau de Perl, pour faire un travail le plus rapidement possible, je ne vois pas quel est le problème. Quoi qu'il en soit, je n'ai jamais prétendu donner une réponse complète - juste un indicateur sur la façon dont on pourrait faire quelque chose. Par conséquent, vous êtes neg rep est pathétique. Je vous mets au défi de fournir une meilleure réponse. – Eamorr

1

Regardez le module standard AnyDBM_File et les autres documents auxquels il fait référence, pour quelques exemples d'utilisation tie au lieu de dbmopen.

2

Le SDBM_File-module de base pourrait attacher un hachage dans un fichier:

use Fcntl; 
use SDBM_File; 

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

Mais: "... la longueur d'une clé, plus la longueur de son associat ed, ne doit pas dépasser 1008 octets. "

Questions connexes