use strict; use warnings; my %Names = (A => 1, B => 1, C => 1); my %FullRecord = (A_1 => 1, D_4 => 1, C_3 => 1, F_6 => 1, B_2 => 1,); my @DesiredRecord = (); foreach my $el (keys(%FullRecord)) { my @SplitArray=split(/\_/,$el); unshift(@DesiredRecord, $el) if exists $Names{$SplitArray[0]}; } print "@DesiredRecord";