my %file_cache; sub open_file($) { my $filename = shift; return $file_cache{$filename} || (open $file_cache{$filename}, ">>$filename" or die "blah blah $!"); } while ( { foreach my $n (@natures) { if ($_ =~ /%n/) { my $out = open_file "$n.txt"; print $out $n; } } }