[此函式已大致被 tie
函式取代。]
這會將 dbm(3)、ndbm(3)、sdbm(3)、gdbm(3) 或 Berkeley DB 檔案繫結到雜湊。HASH 是雜湊的名稱。(與一般的 open
不同,第一個參數不是檔案句柄,即使它看起來像一個檔案句柄)。DBNAME 是資料庫的名稱(如果有 .dir 或 .pag 副檔名,則不含副檔名)。如果資料庫不存在,則會以 MASK 指定的保護建立(由 umask
修改)。若要避免在資料庫不存在時建立資料庫,您可以指定 MASK 為 0,如果找不到現有的資料庫,函式將傳回 false 值。如果您的系統只支援較舊的 DBM 函式,您只能在程式中呼叫一次 dbmopen
。在較舊版本的 Perl 中,如果您的系統既沒有 DBM 也不支援 ndbm,呼叫 dbmopen
會產生致命錯誤;現在它會退回到 sdbm(3)。
如果您沒有 DBM 檔案的寫入權限,您只能讀取雜湊變數,不能設定。如果您想要測試是否可以寫入,請使用檔案測試或嘗試在 eval
內設定一個虛擬雜湊項目來捕捉錯誤。
請注意,例如 keys
和 values
等函式在用於大型 DBM 檔案時可能會傳回龐大的清單。您可能比較喜歡使用 each
函式來反覆處理大型 DBM 檔案。範例
# print out history file offsets
dbmopen(%HIST,'/usr/lib/news/history',0666);
while (($key,$val) = each %HIST) {
print $key, ' = ', unpack('L',$val), "\n";
}
dbmclose(%HIST);
另請參閱 AnyDBM_File 以取得各種 dbm 方法的優缺點的更一般性說明,以及 DB_File 以取得特別豐富的實作。
您可以在呼叫 dbmopen
之前載入該函式庫,以控制您使用的 DBM 函式庫。
use DB_File;
dbmopen(%NS_Hist, "$ENV{HOME}/.netscape/history.db")
or die "Can't open netscape history file: $!";
移植性問題:perlport 中的「dbmopen」。