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 實作是一個只會 croak 的 stub。
從繫結雜湊 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 的套件定義。請參閱 perltie 中的「SCALAR」 以了解當 SCALAR
不存在時會發生什麼事。
與各種 DBM 相關實作(DB_File、NDBM_File 等)相關的套件顯示一般繫結雜湊的範例,Config 模組也是如此。儘管這些套件不使用 Tie::Hash,但它們是良好的工作範例。