my %emp = ( 987654 => { Emp=>'A. Employee', Org=>'ABC', '...'=> }, 987653 => { Emp=>'A.N.Other', Org=>'DEF', '...'=> }, # ..... ); #### my %OrgEmp; push @{ $OrgEmp{$_}{Org}}, $emp{$_}{Emp} for keys %emp; #### my $re_org = qr[ '(' . join('|', qw[ABC DEF ...]) . ')' ]o; my %OrgEmp; for my $empNo (keys %emp) { push @{ $OrgEmp{$1} }, $emp{$empNo}{Emp} if $emp{$empNo}{Org} =~ $re_org; } #### for my $org (keys %OrgEmp) { open OUT, '>', 'Group' . $org or die $!; print OUT "$_\n" for @{ $OrgEmp{$org} }; close OUT; } #### my %groups = map{ open my $fh, '>', "Group$_" or die $!; $_ => $fh; } qw[ABC DEF ...]; for my $empNo (keys %emp) { for my $grp (keys %groups) { #! Note the {} (bare block) around the filehandle are necessary. print { $groups{$grp} } $emp{$empNo}{Emp} if $emp{$empNo}{Org} =~ m[$grp]; } }