my %FH; while () { my $key = ...determine key from $_... my $fh = $FH{$key} ||= open_fh_for_key($key); print $fh $_; } for my $fh (vals(%FH)) { close $fh }; # ... or just wait for %FH to go out of scope