dbmopen HASH,DBNAME,MASK

[此函数已被 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 文件使用 keysvalues 等函数时,它们可能会返回巨大的列表。您可能更喜欢使用 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"