內容

名稱

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 選擇性地匯出下列常數

這些常數也可以與完全限定的名稱一起使用,例如 SDBM_File::PAGFEXT

診斷

如果失敗,tie 呼叫會傳回未定義的值,並且可能會設定 $! 來包含無法繫結檔案的原因。

sdbm store 傳回 -1,errno 22,鍵 "..." 在 ...

當您嘗試儲存太長的鍵或值時,會發出此警告。這表示變更未記錄在資料庫中。請參閱下方的 BUG 和警告。

安全性警告

請勿接受來自不受信任來源的 SDBM 檔案!

sdbm 檔案格式的設計著重於速度和便利性,而不是可攜性或安全性。惡意製作的檔案可能會導致 perl 崩潰,甚至暴露安全性漏洞。

BUG 和警告

您可以在 SDBM 檔案中儲存的資料大小有許多限制。最重要的限制是鍵的長度加上其關聯值的長度不得超過 1008 位元組。

請參閱 perlfunc 中的「tie」perldbmfilterFcntl