use List::MoreUtils qw(first_index); my @all; my @data2_acc_list; push @data2_acc_list, $data2->[$_]{ACC} for 0..$#$data2; for (0..$#$data1){ my $acc = $data1->[$_]{ACC}; my $index = first_index { /$acc/ } @data2_acc_list; if ($index >= 0){ push @all, { %{ $data1->[$_] }, %{ $data2->[$index] } }; } } print Dumper \@all;