diff options
Diffstat (limited to 'contrib/perl5/lib/Tie/RefHash.pm')
| -rw-r--r-- | contrib/perl5/lib/Tie/RefHash.pm | 50 | 
1 files changed, 44 insertions, 6 deletions
diff --git a/contrib/perl5/lib/Tie/RefHash.pm b/contrib/perl5/lib/Tie/RefHash.pm index ffa9eb20a00c..461148821f59 100644 --- a/contrib/perl5/lib/Tie/RefHash.pm +++ b/contrib/perl5/lib/Tie/RefHash.pm @@ -9,17 +9,26 @@ Tie::RefHash - use references as hash keys      require 5.004;      use Tie::RefHash;      tie HASHVARIABLE, 'Tie::RefHash', LIST; +    tie HASHVARIABLE, 'Tie::RefHash::Nestable', LIST;      untie HASHVARIABLE;  =head1 DESCRIPTION -This module provides the ability to use references as hash keys if -you first C<tie> the hash variable to this module. +This module provides the ability to use references as hash keys if you +first C<tie> the hash variable to this module.  Normally, only the +keys of the tied hash itself are preserved as references; to use +references as keys in hashes-of-hashes, use Tie::RefHash::Nestable, +included as part of Tie::RefHash.  It is implemented using the standard perl TIEHASH interface.  Please  see the C<tie> entry in perlfunc(1) and perltie(1) for more information. +The Nestable version works by looking for hash references being stored +and converting them to tied hashes so that they too can have +references as keys.  This will happen without warning whenever you +store a reference to one of your own hashes in the tied hash. +  =head1 EXAMPLE      use Tie::RefHash; @@ -36,6 +45,11 @@ see the C<tie> entry in perlfunc(1) and perltie(1) for more information.         print ref($_), "\n";      } +    tie %h, 'Tie::RefHash::Nestable'; +    $h{$a}->{$b} = 1; +    for (keys %h, keys %{$h{$a}}) { +       print ref($_), "\n"; +    }  =head1 AUTHOR @@ -43,7 +57,7 @@ Gurusamy Sarathy        gsar@activestate.com  =head1 VERSION -Version 1.21    22 Jun 1999 +Version 1.3    8 Apr 2001  =head1 SEE ALSO @@ -51,11 +65,13 @@ perl(1), perlfunc(1), perltie(1)  =cut -require 5.003_11; +use v5.6.0;  use Tie::Hash; -@ISA = qw(Tie::Hash);  use strict; +our @ISA = qw(Tie::Hash); +our $VERSION = '1.3'; +  sub TIEHASH {    my $c = shift;    my $s = []; @@ -68,7 +84,17 @@ sub TIEHASH {  sub FETCH {    my($s, $k) = @_; -  (ref $k) ? $s->[0]{"$k"}[1] : $s->[1]{$k}; +  if (ref $k) { +      if (defined $s->[0]{"$k"}) { +        $s->[0]{"$k"}[1]; +      } +      else { +        undef; +      } +  } +  else { +      $s->[1]{$k}; +  }  }  sub STORE { @@ -121,4 +147,16 @@ sub CLEAR {    %{$s->[1]} = ();  } +package Tie::RefHash::Nestable; +our @ISA = qw(Tie::RefHash); + +sub STORE { +  my($s, $k, $v) = @_; +  if (ref($v) eq 'HASH' and not tied %$v) { +      my @elems = %$v; +      tie %$v, ref($s), @elems; +  } +  $s->SUPER::STORE($k, $v); +} +  1;  | 
