use warnings; use strict; $\ = $/ = "\n"; sub ifdef { defined ($_[0]) ? $_[0] : ifdef($_[1], 'undef'); } ################################################## # # return each directly # package TIED_HASH_1; use Tie::Hash; our @ISA = qw(Tie::StdHash); sub FIRSTKEY { print "TIED_HASH_1 FIRSTKEY " . (wantarray ? "array" : "scalar"); my $a = scalar keys %{$_[0]}; return each %{$_[0]}; } sub NEXTKEY { print "TIED_HASH_1 NEXTKEY " . (wantarray ? "array" : "scalar"); return each %{$_[0]}; } ################################################## # # return each INdirectly # package TIED_HASH_2; use Tie::Hash; our @ISA = qw(Tie::StdHash); sub FIRSTKEY { print "TIED_HASH_2 FIRSTKEY " . (wantarray ? "array" : "scalar"); my $a = scalar keys %{$_[0]}; my ($x,$y) = each %{$_[0]}; print "x='$x' y='$y'"; # note $x and $y are fine return ($x, $y); } sub NEXTKEY { print "TIED_HASH_2 NEXTKEY " . (wantarray ? "array" : "scalar"); my ($x,$y) = each %{$_[0]}; print "x='$x' y='$y'"; # note $x and $y are fine return ($x, $y); } ################################################## # package main; my %h_untied; my %h_tied_1; my %h_tied_2; tie %h_tied_1, 'TIED_HASH_1'; tie %h_tied_2, 'TIED_HASH_2'; $h_untied{unt_a}=11; $h_untied{unt_b}=22; $h_tied_1 {t_1_a}=11; $h_tied_1 {t_1_b}=22; $h_tied_2 {t_2_a}=11; $h_tied_2 {t_2_b}=22; my ($k, $v); my @res; print "-------------------- untied hash works fine"; ($k, $v) = each %h_untied; print "k='$k' v='$v'"; ($k, $v) = each %h_untied; print "k='$k' v='$v'"; print "-------------------- tied hash returning each's return directly works fine"; ($k, $v) = each %h_tied_1; print "k='$k' v='".ifdef($v)."'"; ($k, $v) = each %h_tied_1; print "k='$k' v='".ifdef($v)."'"; print "-------------------- tied hash returning its own list is brok"; ($k, $v) = each %h_tied_2; print "k='$k' v='".ifdef($v)."'"; ($k, $v) = each %h_tied_2; print "k='$k' v='".ifdef($v)."'";