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 函数应返回预期值。
绑定的数据结构是一个数组引用,其元素为
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:[email protected]。