my %fh; # key: path, value: filehandle if ($cond1) { my $text = "text1\n"; $text .= somefunc(); # whatever append($path1, $text); } elsif ($cond2) { my $text = "some other text\n"; append($path2, $text); } elsif (...) { ... } else { ... } # when done: close $fh{$_} for keys %fh; sub append { my ($path, $text) = @_; unless ( exists $fh{$path} ) { open my $fh, '>>', $path or die "Can't append to $path: $!\n"; $fh{$path} = $fh; } print {$fh{$path}} $text; } #### my %paths = ( LOG => '/path/to/log.txt', ERROR => '/path/to/errorlog.txt', INFO => '/path/to/info.txt', ); my %fh; # key: token, value: filehandle ... if (...) { $text = ... append('LOG',$text); } else { ... } sub append { my ($token, $text) = @_; my$ fh unless (exists $fh{$token} ) { open my $fh, '>>', $paths{$token} or die $!; $fh{$token} = $fh; } print {$fh{$token}} $text; }