use warnings; use strict; use Data::Dumper; my @array; my %hash = ( abc=>123 ); push @array, \%hash; %hash = ( def=>456 ); push @array, \%hash; print Dumper(\@array); print $array[1]{def}, "\n"; # ok print $array[0]{abc}, "\n"; # nope! hash was cleared! __END__ $VAR1 = [ { 'def' => 456 }, $VAR1->[0] ]; 456 Use of uninitialized value in print at test.pl line 13.