如何有效地清空Perl DBM文件?

pax*_*blo 7 perl dbm

我继承了一段带有代码片段的代码,该代码段清空数据库,如下所示:

dbmopen (%db,"file.db",0666);
foreach $key (keys %db) {
  delete $db{$key};
}
dbmclose (%db);
Run Code Online (Sandbox Code Playgroud)

这通常是可以的,但有时数据库在调用此清理代码之前会变得非常大,并且通常在用户想要执行重要操作时.

有没有更好的方法呢?

bri*_*foy 10

你可以删除文件:

unlink $file;
Run Code Online (Sandbox Code Playgroud)

由于dbmopen的第三个参数是文件模式而不是undef,因此dbmopen将在下次调用时重新创建文件:

dbmopen my %db, $file, 0666;
Run Code Online (Sandbox Code Playgroud)


pax*_*blo 6

实际上,一位同事指出了我的解决方案.你显然可以这样做:

dbmopen (%db,"file.db",0666);
%db = ();
dbmclose (%db);
Run Code Online (Sandbox Code Playgroud)

在关闭数据库之前清除哈希值.


pax*_*blo 6

这里有另一个答案,由于某种原因已经消失,但它可能会更快,所以我重新发布它(不知道为什么它被删除).它涉及取消链接文件以删除它,然后只是重新创建一个空白数据库文件,如下所示:

unlink ("file.db");
dbmopen (%db,"file.db",0666);
dbmclose (%db);
Run Code Online (Sandbox Code Playgroud)