2008-10-13 13 views
7

he heredado una pieza de código con un fragmento de la cual se vacía la base de datos de la siguiente manera:¿Cómo puedo vaciar de manera eficiente un archivo Perl DBM?

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

Esto es por lo general bien, pero a veces la base de datos crece muy grande antes de que este código de limpieza se llama y es por lo general cuando un usuario quiere hacer algo importante

¿Hay una mejor manera de hacerlo?

Respuesta

10

Usted puede simplemente eliminar el archivo:

unlink $file; 

Desde el tercer argumento a dbmopen es un modo de archivo y no undef, dbmopen volverá a crear el archivo la próxima vez que se llame:

dbmopen my %db, $file, 0666; 
6

En realidad, un compañero de trabajo me ha señalado una solución. Aparentemente puede hacer:

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

que borra el hash antes de cerrar la base de datos.

6

Hubo otra respuesta aquí que ha desaparecido por algún motivo, aunque es probable que sea más rápida, por lo que la vuelvo a publicar (no estoy seguro de por qué se eliminó). Se trata de desvincular el archivo para eliminarlo a continuación, sólo volver a crear un archivo de base de datos en blanco de la siguiente manera:

unlink ("file.db"); 
dbmopen (%db,"file.db",0666); 
dbmclose (%db); 
Cuestiones relacionadas