sub CLEAR { my $self = shift; foreach ( @$self ) { foreach my $key ( keys %$_ ) { delete $_->{ $key } } } $self = [ { } ]; } #### sub CLEAR { my $self = shift; @$self = ( {} ); } #### sub CLEAR { $_[0] = [ {} ]; } #### use Carp; sub push_hash (\%) { my $href = shift; my $obj = tied %$href; croak "must be a Tie::Hash::Stack tied hash" unless $obj and $obj->isa('Tie::Hash::Stack'); push @$obj, {}; } sub pop_hash (\%) { my $href = shift; my $obj = tied %$href; croak "must be a Tie::Hash::Stack tied hash" unless $obj and $obj->isa('Tie::Hash::Stack'); pop @$obj; } # and in your program... tie my(%stash), 'Tie::Hash::Stack'; # ... push_hash %stash; # ...