dbmopen HASH,DBNAME,MASK

[此函式已大致被 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 內設定一個虛擬雜湊項目來捕捉錯誤。

請注意,例如 keysvalues 等函式在用於大型 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」