2008-10-13 9 views
7

J'ai hérité d'un morceau de code avec un extrait qui vide la base de données comme suit:Comment vider efficacement un fichier Perl DBM?

dbmopen (%db,"file.db",0666); 
foreach $key (keys %db) { 
    delete $db{$key}; 
} 
dbmclose (%db); 

C'est généralement correct mais parfois la base de données devient très importante avant le code de nettoyage est appelé et il est généralement lorsqu'un utilisateur veut faire quelque chose d'important.

Y a-t-il une meilleure façon de procéder?

Répondre

10

Vous pouvez simplement supprimer le fichier:

unlink $file; 

Depuis votre troisième argument à dbmopen est un mode de fichier et pas undef, dbmopen va recréer le fichier la prochaine fois qu'il s'appelle:

dbmopen my %db, $file, 0666; 
6

En fait, un collègue m'a indiqué une solution. Vous pouvez apparemment faire:

dbmopen (%db,"file.db",0666); 
%db =(); 
dbmclose (%db); 

qui efface le hachage avant de fermer la base de données.

6

Il y avait une autre réponse ici qui a disparu pour une raison quelconque, mais il était susceptible d'être plus rapide, donc je le repasse (je ne sais pas pourquoi il a été supprimé). Elle implique dissociant le fichier à supprimer puis juste recréer un fichier de base de données vide comme suit:

unlink ("file.db"); 
dbmopen (%db,"file.db",0666); 
dbmclose (%db); 
Questions connexes