dbmclose

来源:互联网 发布:莫烦python 编辑:程序博客网 时间:2024/06/05 08:11
dbmclose   dbmclose HASH

这个函数打破在一个 DBM (数据库管理)文件和一个散列之间的绑定。dbmclose 实际上只是一个带有合适参数的 untie 的调用,提供它只是为了保持与古老的 Perl 版本的向下兼容。

dbmopen   dbmopen HASH, DBNAME, MODE

这个函数把一个 DBM 文件和一个散列(也就是说,一个关联性数组)捆绑在一起。(DBM 的意思是数据库管理,由一个 C 库过程组成,它允许你通过散列算法随机地访问记录。)HASH 是散列的名字(包括 %)。DBNAME 是数据库的名字(没有 .dir 或者 .pag 扩展)。如果该数据库并不存在并且声明了一个有效的 MODE,那么该数据库就带着声明的 MODE 的保护(模式)创建,就象 umask 修改的那样。为了避免数据库不存在的时候的创建动作,你可以声明 MODE 为 undef,并且如果该函数无法找到一个现有数据库,那么将返回假。在 dbmopen 之前赋予散列的值是不能访问的。

dbmopen 函数实际上只是一个带有合适参数的 tie 的调用,提供它只是为了保持与早期的 Perl 版本的向下兼容。你可以通过直接使用 tie 接口或者通过在调用 dbmopen 之前装载合适的模块来控制自己使用哪个 DBM 库。下面是一个例子,它可以在一些 DB_File 的版本和你的 Netscape 浏览器版本类似的系统上运行:

   use DB_File;   dbmopen(%NS_Hist, "$ENV{HOME}/.netscape/history.dat", undef_      or die "Can't open netscape history file: $!";   while (($url, $when) = each %NS_Hist) {      next unless defined($when);      chop($url, $when);      # 删除尾部的空字节      printf "Visited %s at %s.\n", $url,         scalar(localtime(unpack("V",$when)));   }

如果你没有 DBM 文件的写权限,那么你就只能读取散列变量,而不能设置它们。如果你想知道自己是否能写,你可以用文件测试,比如 -w $file,或者尝试在一个 eval{} 里面设置一个假散列记录,而 eval{} 会捕获例外。

如果在很大的 DBM 文件上使用,keys 和 values 这样的函数可能会返回巨大的列表值。你可能会愿意使用 each 函数叙述特大 DBM 文件,这样就不会一次把所有东西都装到内存里。

与 DBM 文件绑定的散列和你使用的 DBM 包有同样的局限性,包括你可以放到一个桶里的数据数量限制。如果你坚持使用短键字和数值,那么这一点很难成为问题。又见第三十二章的 DB_File 模块。

你应该记在心里的另外一件事情是许多现有的 DBM 数据库包含空结尾的键字和数值,因为它们是以 C 程序的概念考虑问题的。Netscape 历史文件和老的 sendmail 别名文件就是例子。只需要在取出数据的时候用 "$key\0",然后从数值里删除空。

   $alias = $aliases{"postmaster\0"};   chop $alias;   # 删除空

目前没有内建的方法锁住一个一般性的 DBM 文件。有些人认为这是一只臭虫。GDBM_File 模块的确试图以整个文件为粒度提供锁定的机制。如果你有问题,那么最好还是使用一个独立的锁文件。


0 0
原创粉丝点击