use warnings; use strict; use Data::Dumper; my $data_a = { 'fullname' => 'Ms Mary Lou', 'first' => 'Mary', 'last' => 'Lou', }; my $data_b = { 'house' => 'main', 'number' => '0123', 'area' => 'north', 'code' => 'zip', }; my $data_c; %{ $data_c } = map { $_ => $data_a->{$_} } keys %$data_b, keys %$data_a; for my $k (keys %$data_a){ $data_b->{$k} = $data_a->{$k} if ! exists $data_b->{$k}; } print Dumper $data_c; print Dumper $data_b;