[此函数已被 tie
函数基本取代。]
此函数将 dbm(3)、ndbm(3)、sdbm(3)、gdbm(3) 或 Berkeley DB 文件绑定到哈希。HASH 是哈希的名称。(与普通的 open
不同,第一个参数不是文件句柄,即使它看起来像一个)。DBNAME 是数据库的名称(如果没有.dir 或.pag 扩展名)。如果数据库不存在,它将使用 MASK 指定的保护创建(由 umask
修改)。为了防止在数据库不存在时创建数据库,您可以指定 MASK 为 0,如果找不到现有数据库,该函数将返回假值。如果您的系统只支持旧的 DBM 函数,您可以在程序中只进行一次 dbmopen
调用。在旧版本的 Perl 中,如果您的系统既没有 DBM 也没有 ndbm,调用 dbmopen
会产生致命错误;现在它会回退到 sdbm(3)。
如果您没有对 DBM 文件的写入权限,您只能读取哈希变量,而不能设置它们。如果您想测试是否可以写入,可以使用文件测试或尝试在 eval
中设置一个虚拟哈希条目来捕获错误。
请注意,当对大型 DBM 文件使用 keys
和 values
等函数时,它们可能会返回巨大的列表。您可能更喜欢使用 each
函数来迭代大型 DBM 文件。示例
# print out history file offsets
dbmopen(%HIST,'/usr/lib/news/history',0666);
while (($key,$val) = each %HIST) {
print $key, ' = ', unpack('L',$val), "\n";
}
dbmclose(%HIST);
另请参阅 AnyDBM_File,了解各种 dbm 方法的优缺点的更一般性描述,以及 DB_File,了解一个特别丰富的实现。
您可以通过在调用 dbmopen
之前加载该库来控制使用哪个 DBM 库。
use DB_File;
dbmopen(%NS_Hist, "$ENV{HOME}/.netscape/history.db")
or die "Can't open netscape history file: $!";
可移植性问题:"perlport 中的 dbmopen"。