內容

名稱

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 儲存在繫結雜湊 thiskey 中。

FETCH this, key

擷取繫結雜湊 thiskey 的資料。

FIRSTKEY this

傳回雜湊中的第一個金鑰。

NEXTKEY this, lastkey

傳回雜湊中的下一個金鑰。

EXISTS this, key

驗證 key 是否存在於繫結雜湊 this 中。

Tie::Hash 實作是一個只會 croak 的 stub。

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

方法 UNTIEDESTROY 未定義於 Tie::HashTie::StdHashTie::ExtraHash。繫結雜湊不需要這些方法,但如果已定義,這些方法將在適當的時間被呼叫,請參閱 perltie

SCALAR 僅定義於 Tie::StdHashTie::ExtraHash

如果需要,這些方法應由繼承自 Tie::HashTie::StdHashTie::ExtraHash 的套件定義。請參閱 perltie 中的「SCALAR」 以了解當 SCALAR 不存在時會發生什麼事。

更多資訊

與各種 DBM 相關實作(DB_FileNDBM_File 等)相關的套件顯示一般繫結雜湊的範例,Config 模組也是如此。儘管這些套件不使用 Tie::Hash,但它們是良好的工作範例。