my %lag_detail = ...; # single instance of this hash in scope ... foreach my $line (...) ) { if (...) { if (...) ) { # push ref. to OLD instance of a hash to anon. array in another hash. push( @{ $self->{"lags"} }, \%lag_detail ); } # change certain values in hash, but hash LOCATION does not change. %lag_detail = ( "lagid" => $lag, "lagdesc" => $4, "operationstate" => $3, "adminstate" => $2 ); } } if (...) { # create NEW instance of a hash in independent scope. # this instance is TOTALLY INDEPENDENT of any other created in this scope. my %port_detail = (...); # push ref. to NEW instance to anon. array in another hash. push @{ $lag_detail{"ports"} }, \%port_detail; } }