内容

名称

Tie::Hash、Tie::StdHash、Tie::ExtraHash - 用于绑定哈希的基类定义

概要

    package NewHash;
    require Tie::Hash;

    @ISA = qw(Tie::Hash);

    sub DELETE { ... }		# Provides needed method
    sub CLEAR { ... }		# Overrides inherited method


    package NewStdHash;
    require Tie::Hash;

    @ISA = qw(Tie::StdHash);

    # All methods provided by default, define
    # only those needing overrides
    # Accessors access the storage in %{$_[0]};
    # TIEHASH should return a reference to the actual storage
    sub DELETE { ... }

    package NewExtraHash;
    require Tie::Hash;

    @ISA = qw(Tie::ExtraHash);

    # All methods provided by default, define 
    # only those needing overrides
    # Accessors access the storage in %{$_[0][0]};
    # TIEHASH should return an array reference with the first element
    # being the reference to the actual storage 
    sub DELETE { 
      $_[0][1]->('del', $_[0][0], $_[1]); # Call the report writer
      delete $_[0][0]->{$_[1]};		  #  $_[0]->SUPER::DELETE($_[1])
    }


    package main;

    tie %new_hash, 'NewHash';
    tie %new_std_hash, 'NewStdHash';
    tie %new_extra_hash, 'NewExtraHash',
	sub {warn "Doing \U$_[1]\E of $_[2].\n"};

描述

此模块为绑定哈希的类提供了一些骨架方法。有关绑定哈希到包所需的函数列表,请参阅 perltie。基本 Tie::Hash 包提供了一个 new 方法,以及 TIEHASHEXISTSCLEAR 方法。Tie::StdHashTie::ExtraHash 包提供了 perltie 中描述的大多数哈希方法(例外是 UNTIEDESTROY)。它们使绑定哈希的行为与标准哈希完全相同,并允许选择性地覆盖方法。Tie::Hashnew 方法具有遗留支持:如果类忘记包含 TIEHASH 方法,则在未定义 TIEHASH 的情况下使用它。

对于想要编写自己的绑定哈希的开发者,下面简要定义了所需的方法。有关更详细的描述和示例代码,请参阅 perltie 部分。

TIEHASH classname, LIST

由命令 tie %hash, classname 调用的方法。将新的哈希实例与指定类关联。LIST 代表完成关联所需的附加参数(类似于 AnyDBM_File 及其同类)。

STORE this, key, value

将数据 value 存储到绑定哈希 this 中的 key 中。

FETCH this, key

检索绑定哈希 thiskey 的数据。

FIRSTKEY this

返回哈希中的第一个键。

NEXTKEY this, lastkey

返回哈希中的下一个键。

EXISTS this, key

验证 key 是否存在于绑定哈希 this 中。

Tie::Hash 实现是一个存根,它只是 croaks。

DELETE this, key

从绑定哈希 this 中删除键 key

CLEAR this

清除绑定哈希 this 中的所有值。

SCALAR this

返回在标量上下文中评估哈希所产生的结果。

Tie::Hash 未实现此方法(但 Tie::StdHashTie::ExtraHash 已实现)。

Tie::StdHash 继承

访问器方法假定绑定哈希中数据的实际存储位于 tied(%tiedhash) 所引用的哈希中。因此,覆盖的 TIEHASH 方法应返回一个哈希引用,其余方法应在第一个参数引用的哈希上操作。

package ReportHash;
our @ISA = 'Tie::StdHash';

sub TIEHASH  {
  my $storage = bless {}, shift;
  warn "New ReportHash created, stored in $storage.\n";
  $storage
}
sub STORE    {
  warn "Storing data with key $_[1] at $_[0].\n";
  $_[0]{$_[1]} = $_[2]
}

Tie::ExtraHash 继承

访问器方法假定绑定哈希中数据的实际存储位于 (tied(%tiedhash))->[0] 所引用的哈希中。因此,覆盖的 TIEHASH 方法应返回一个数组引用,其第一个元素是一个哈希引用,其余方法应在哈希 %{ $_[0]->[0] } 上操作。

package ReportHash;
our @ISA = 'Tie::ExtraHash';

sub TIEHASH  {
  my $class = shift;
  my $storage = bless [{}, @_], $class;
  warn "New ReportHash created, stored in $storage.\n";
  $storage;
}
sub STORE    {
  warn "Storing data with key $_[1] at $_[0].\n";
  $_[0][0]{$_[1]} = $_[2]
}

默认的 TIEHASH 方法将 tie() 的“额外”参数存储在 tied(%tiedhash) 所引用的数组中从偏移量 1 开始的位置;这与上面 TIEHASH 子例程中的存储算法相同。因此,从 Tie::ExtraHash 继承的典型包不需要覆盖此方法。

SCALARUNTIEDESTROY

方法 UNTIEDESTROYTie::HashTie::StdHashTie::ExtraHash 中没有定义。绑定哈希不需要这些方法的存在,但如果定义了,这些方法将在适当的时间被调用,请参阅 perltie

SCALAR 仅在 Tie::StdHashTie::ExtraHash 中定义。

如果需要,这些方法应该由继承自 Tie::HashTie::StdHashTie::ExtraHash 的包定义。请参阅 "SCALAR" in perltie 以了解当 SCALAR 不存在时会发生什么。

更多信息

与各种 DBM 相关实现(DB_FileNDBM_File 等)相关的包展示了通用绑定哈希的示例,Config 模块也是如此。虽然这些没有使用 Tie::Hash,但它们是良好的工作示例。