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. #### my $lag_detail; foreach my $line ( split( /\n/, $c ) ) { if ( $line =~ m/someregex/ ) { if ( exists $lag_detail->{ports} ) { push( @{ $self->{lags} }, $lag_detail ); } $lag_detail = { lagid => $lag, lagdesc => $4, operationstate => $3, adminstate => $2 }; } } #### foreach my $line ( split( /\n/, $c ) ) { my %lag_detail; ...