Как эффективно очистить файл Perl DBM?

Я унаследовал фрагмент кода с фрагментом, который очищает базу данных следующим образом:

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

Обычно это нормально, но иногда база данных становится очень большой, прежде чем вызывается этот код очистки, и обычно это происходит, когда пользователь хочет сделать что-то важное.

Есть ли лучший способ сделать это?


person paxdiablo    schedule 13.10.2008    source источник


Ответы (3)


Вы можете просто удалить файл:

unlink $file;

Поскольку ваш третий аргумент dbmopen — это файловый режим, а не undef, dbmopen воссоздаст файл при следующем вызове:

dbmopen my %db, $file, 0666;
person brian d foy    schedule 13.10.2008

На самом деле, коллега указал мне на решение. Очевидно, вы можете сделать:

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

который очищает хэш перед закрытием базы данных.

person paxdiablo    schedule 13.10.2008

Здесь был еще один ответ, который по какой-то причине исчез, но, вероятно, он был быстрее, поэтому я публикую его повторно (не знаю, почему он был удален). Это включает в себя отсоединение файла, чтобы удалить его, а затем просто воссоздание пустого файла базы данных следующим образом:

unlink ("file.db");
dbmopen (%db,"file.db",0666);
dbmclose (%db);
person paxdiablo    schedule 13.10.2008