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
方法,以及 TIEHASH
、EXISTS
和 CLEAR
方法。Tie::StdHash 和 Tie::ExtraHash 包提供了 perltie 中描述的大多数哈希方法(例外是 UNTIE
和 DESTROY
)。它们使绑定哈希的行为与标准哈希完全相同,并允许选择性地覆盖方法。Tie::Hash 对 new
方法具有遗留支持:如果类忘记包含 TIEHASH
方法,则在未定义 TIEHASH
的情况下使用它。
对于想要编写自己的绑定哈希的开发者,下面简要定义了所需的方法。有关更详细的描述和示例代码,请参阅 perltie 部分。
由命令 tie %hash, classname
调用的方法。将新的哈希实例与指定类关联。LIST
代表完成关联所需的附加参数(类似于 AnyDBM_File 及其同类)。
将数据 value 存储到绑定哈希 this 中的 key 中。
检索绑定哈希 this 中 key 的数据。
返回哈希中的第一个键。
返回哈希中的下一个键。
验证 key 是否存在于绑定哈希 this 中。
Tie::Hash 实现是一个存根,它只是 croaks。
从绑定哈希 this 中删除键 key。
清除绑定哈希 this 中的所有值。
返回在标量上下文中评估哈希所产生的结果。
Tie::Hash 未实现此方法(但 Tie::StdHash 和 Tie::ExtraHash 已实现)。
访问器方法假定绑定哈希中数据的实际存储位于 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]
}
访问器方法假定绑定哈希中数据的实际存储位于 (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 继承的典型包不需要覆盖此方法。
SCALAR
、UNTIE
和 DESTROY
方法 UNTIE
和 DESTROY
在 Tie::Hash、Tie::StdHash 或 Tie::ExtraHash 中没有定义。绑定哈希不需要这些方法的存在,但如果定义了,这些方法将在适当的时间被调用,请参阅 perltie。
SCALAR
仅在 Tie::StdHash 和 Tie::ExtraHash 中定义。
如果需要,这些方法应该由继承自 Tie::Hash、Tie::StdHash 或 Tie::ExtraHash 的包定义。请参阅 "SCALAR" in perltie 以了解当 SCALAR
不存在时会发生什么。
与各种 DBM 相关实现(DB_File、NDBM_File 等)相关的包展示了通用绑定哈希的示例,Config 模块也是如此。虽然这些没有使用 Tie::Hash,但它们是良好的工作示例。