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 hash 變數與 SDBM_File 格式的檔案之間建立連結。您可以像操作 Perl hash 一樣操作檔案中的資料,但當程式結束時,資料會保留在檔案中,供下次執行程式時使用。
使用 Perl 內建函式 tie
搭配 SDBM_File
,在變數與檔案之間建立連結。
tie %hash, 'SDBM_File', $basename, $modeflags, $perms;
tie %hash, 'SDBM_File', $dirfile, $modeflags, $perms, $pagfilename;
$basename
是資料庫的基本檔名。資料庫是兩個檔案,副檔名分別為 ".dir" 和 ".pag",附加在 $basename
之後,
$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
如果您想要在檔案不存在時建立檔案,則也按位元運算 OR (|
) 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 傳回 -1,errno 22,鍵 "..." 在 ...
當您嘗試儲存太長的鍵或值時,會發出此警告。這表示變更未記錄在資料庫中。請參閱下方的 BUG 和警告。
請勿接受來自不受信任來源的 SDBM 檔案!
sdbm 檔案格式的設計著重於速度和便利性,而不是可攜性或安全性。惡意製作的檔案可能會導致 perl 崩潰,甚至暴露安全性漏洞。
您可以在 SDBM 檔案中儲存的資料大小有許多限制。最重要的限制是鍵的長度加上其關聯值的長度不得超過 1008 位元組。