my %handles; while () { my $file_out = get_the_way_out($_); my @some_data = get_the_data($_); if (!exists $handles{$file_out}) { open my $handle,'>',$file_out or die $!; $handles{$file_out} = $handle; } # but this is not allowed say $handles{$file_out} join "\t",@some_data; } close $_ foreach values %handles;