内容

名称

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 继承

绑定的数据结构是一个数组引用,其元素为

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:[email protected]