内容

名称

SDBM_File - 绑定访问 sdbm 文件

语法

use Fcntl;   # For O_RDWR, O_CREAT, etc.
use SDBM_File;

tie(%h, 'SDBM_File', 'filename', O_RDWR|O_CREAT, 0666)
  or die "Couldn't tie SDBM file 'filename': $!; aborting";

# Now read and change the hash
$h{newkey} = newvalue;
print $h{oldkey}; 
...

untie %h;

说明

SDBM_File 在 Perl 哈希变量和 SDBM_File 格式的文件之间建立连接。您可以像操作 Perl 哈希一样操作文件中的数据,但当您的程序退出时,数据将保留在文件中,以便在下次运行程序时使用。

绑定

SDBM_File 与 Perl 内置 tie 函数配合使用,以在变量和文件之间建立连接。

tie %hash, 'SDBM_File', $basename, $modeflags, $perms;

tie %hash, 'SDBM_File', $dirfile,  $modeflags, $perms, $pagfilename;

$basename 是数据库的基本文件名。数据库是两个文件,在 $basename 后添加 ".dir" 和 ".pag" 扩展名,

$basename.dir     (or .sdbm_dir on VMS, per DIRFEXT constant)
$basename.pag

这两个文件名也可以分别完整地指定为 $dirfile$pagfilename。这适用于没有 ".dir" 和 ".pag" 扩展名的两个文件,例如 File::Temp 中的两个文件。

$modeflags 可以是 Fcntl 模块中的以下常量(类似于 open(2) 系统调用),

O_RDONLY          read-only access
O_WRONLY          write-only access
O_RDWR            read and write access

如果您希望在文件不存在时创建文件,则按位或 (|) O_CREAT。如果您省略 O_CREAT 且数据库不存在,则 tie 调用将失败。

O_CREAT           create database if doesn't already exist

$perms 是在创建新数据库文件时要使用的文件权限位。即使不创建新数据库,此参数也是必需的。权限将因用户的 umask 而减少,因此此处通常的值为 0666,如果是一些非常私密的数据,则为 0600。(请参阅 perlfunc 中的“umask”。)

导出

SDBM_File 可选择导出以下常量

这些常量也可以与完全限定名称一起使用,例如 SDBM_File::PAGFEXT

诊断

如果失败,tie 调用将返回一个未定义的值,并可能将 $! 设置为包含无法绑定文件的原因。

sdbm store returned -1, errno 22, key "..." at ...

当您尝试存储过长的键或值时,将发出此警告。这意味着更改未记录在数据库中。请参阅下面的 BUG 和警告。

安全警告

不要接受来自不受信任来源的 SDBM 文件!

sdbm 文件格式的设计目的是为了速度和便利,而不是为了可移植性或安全性。恶意制作的文件可能会导致 perl 崩溃,甚至暴露安全漏洞。

BUG 和警告

您可以存储在 SDBM 文件中的数据大小存在许多限制。最重要的是,键的长度加上其关联值的长度不能超过 1008 字节。

请参阅 perlfunc 中的“tie”perldbmfilterFcntl