You don't need to use a bareword for a filehandle. You can use a lexical variable as a filehandle, and store its value in a hash table keyed with the associated file path. In a writing sub, you check whether the path exists in the hash, and open it if it doesn't:
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; }
That way, you only open files as needed. You could also use another hash for the paths, keyed with some meaningful strings:
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; }
so you need not pass the path every time to the append() subroutine, only the key upon which it is stored in your path hash.
In reply to Re: Open Filehandle once
by shmem
in thread Open Filehandle once
by Dunkellbusch
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |