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 可选择导出以下常量
PAGFEXT
- 用于页文件的扩展名,通常为 .pag
。
DIRFEXT
- 用于目录文件的扩展名,在 VMS 之外的所有地方为 .dir
,在 VMS 中为 .sdbm_dir
。
PAIRMAX
- 存储的哈希项的最大大小,包括键和值的长。
这些常量也可以与完全限定名称一起使用,例如 SDBM_File::PAGFEXT
。
如果失败,tie
调用将返回一个未定义的值,并可能将 $!
设置为包含无法绑定文件的原因。
sdbm store returned -1, errno 22, key "..." at ...
当您尝试存储过长的键或值时,将发出此警告。这意味着更改未记录在数据库中。请参阅下面的 BUG 和警告。
不要接受来自不受信任来源的 SDBM 文件!
sdbm 文件格式的设计目的是为了速度和便利,而不是为了可移植性或安全性。恶意制作的文件可能会导致 perl 崩溃,甚至暴露安全漏洞。
您可以存储在 SDBM 文件中的数据大小存在许多限制。最重要的是,键的长度加上其关联值的长度不能超过 1008 字节。