內容

名稱

Tie::Memoize - 在需要時將資料新增到雜湊

語法

require Tie::Memoize;
tie %hash, 'Tie::Memoize',
    \&fetch,			# The rest is optional
    $DATA, \&exists,
    {%ini_value}, {%ini_existence};

說明

這個套件允許綁定的雜湊在第一次存取時自動載入其值,並在後續存取時使用快取值。

只有讀取存取(透過取得值或 exists)會呼叫函數;修改存取會像在一般雜湊中一樣執行。

tie 期間需要的參數有雜湊、套件和 FETCHing 函數的參考。選用參數有任意純量 $data、EXISTS 函數的參考,以及雜湊和存在快取的初始值。

FETCHing 函數和 EXISTS 函數具有相同的簽章:參數為 $key, $data;$data 與在 tie()ing 期間提供給參數的值相同。如果值不存在,兩個函數都應該傳回空清單。如果 EXISTS 函數與 FETCHing 函數不同,它應該在成功時傳回 TRUE 值。如果金鑰有效,FETCHing 函數應該傳回預期的值。

繼承自 Tie::Memoize

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_file1fake_file2 會擷取值 $content1 和 $content2,而 pretend_does_not_exists 永遠不會被存取。此外,known_to_exist 的存在從未被檢查(因此如果在需要其內容時它不存在,%hash 的使用者可能會感到困惑)。

錯誤

FIRSTKEY 和 NEXTKEY 方法會瀏覽已讀取的金鑰,而不是雜湊的所有可能金鑰。

作者

Ilya Zakharevich mailto:perl-module-hash-memoize@ilyaz.org