in reply to efficiently printing to 30 files

though I don't particularly care for printing as you go, and like the hash idea above, this was my attempt at exactly what you proposed (tested lightly, meaning it compiles, and may not work as you wish):
mkdir "reports", 0755 || warn "Cannot make reports director: $!"; chdir ("reports") || die "couldn't change to directory : $!"; # tried to quickly put these together into a hash, # but made for more code than necessary # the way it stands now, @patterns and @files should have # the same number of (corresponding) elements my @patterns = (qr/ABC/, qr/DEF/, qr/GHI/); my @files = map { local *FH; open(FH, '>', 'group' . $_); *FH } qw(A B + C); foreach my $n (keys %emp) { for my $index (0..$#patterns) { if ($emp{$n}{'Org'} =~ $patterns[$index]) { local *FH = $files[$index]; print FH $emp{$n}{'Emp'} . "\n"; } } }