Tie::Memoize - 在需要時將資料新增到雜湊
require Tie::Memoize;
tie %hash, 'Tie::Memoize',
\&fetch, # The rest is optional
$DATA, \&exists,
{%ini_value}, {%ini_existence};
這個套件允許綁定的雜湊在第一次存取時自動載入其值,並在後續存取時使用快取值。
只有讀取存取(透過取得值或 exists
)會呼叫函數;修改存取會像在一般雜湊中一樣執行。
在 tie
期間需要的參數有雜湊、套件和 FETCH
ing 函數的參考。選用參數有任意純量 $data、EXISTS
函數的參考,以及雜湊和存在快取的初始值。
FETCH
ing 函數和 EXISTS
函數具有相同的簽章:參數為 $key, $data
;$data 與在 tie()ing 期間提供給參數的值相同。如果值不存在,兩個函數都應該傳回空清單。如果 EXISTS
函數與 FETCH
ing 函數不同,它應該在成功時傳回 TRUE 值。如果金鑰有效,FETCH
ing 函數應該傳回預期的值。
tied() 資料的結構是具有元素的陣列參考
0: cache of known values
1: cache of known existence of keys
2: FETCH function
3: EXISTS function
4: $data
其餘部分供此套件內部使用。特別是,如果覆寫 TIEHASH,它應該呼叫 SUPER::TIEHASH。
sub slurp {
my ($key, $dir) = shift;
open my $h, '<', "$dir/$key" or return;
local $/; <$h> # slurp it all
}
sub exists { my ($key, $dir) = shift; return -f "$dir/$key" }
tie %hash, 'Tie::Memoize', \&slurp, $directory, \&exists,
{ fake_file1 => $content1, fake_file2 => $content2 },
{ pretend_does_not_exists => 0, known_to_exist => 1 };
此範例將 $directory 的略微修改內容視為雜湊。修改內容為金鑰 fake_file1 和 fake_file2 會擷取值 $content1 和 $content2,而 pretend_does_not_exists 永遠不會被存取。此外,known_to_exist 的存在從未被檢查(因此如果在需要其內容時它不存在,%hash 的使用者可能會感到困惑)。
FIRSTKEY 和 NEXTKEY 方法會瀏覽已讀取的金鑰,而不是雜湊的所有可能金鑰。
Ilya Zakharevich mailto:perl-module-hash-memoize@ilyaz.org。