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;
tie %hash, 'SDBM_File', $basename, $modeflags, $perms; tie %hash, 'SDBM_File', $dirfile, $modeflags, $perms, $pagfilename;
$basename is the base filename for the database. The database is two files with ``.dir'' and ``.pag'' extensions appended to $basename,
$basename.dir (or .sdbm_dir on VMS, per DIRFEXT constant) $basename.pag
The two filenames can also be given separately in full as $dirfile and $pagfilename. This suits for two files without ``.dir'' and ``.pag'' extensions, perhaps for example two files from File::Temp.
$modeflags can be the following constants from the "Fcntl" module (in the style of the open(2) system call),
O_RDONLY read-only access O_WRONLY write-only access O_RDWR read and write access
If you want to create the file if it does not already exist then bitwise-OR ("|") "O_CREAT" too. If you omit "O_CREAT" and the database does not already exist then the "tie" call will fail.
O_CREAT create database if doesn't already exist
$perms is the file permissions bits to use if new database files are created. This parameter is mandatory even when not creating a new database. The permissions will be reduced by the user's umask so the usual value here would be 0666, or if some very private data then 0600. (See ``umask'' in perlfunc.)
These constants can also be used with fully qualified names, eg. "SDBM_File::PAGFEXT".
The sdbm file format was designed for speed and convenience, not for portability or security. A maliciously crafted file might cause perl to crash or even expose a security vulnerability.
See ``tie'' in perlfunc, perldbmfilter, Fcntl