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.

perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'

In reply to Re: Open Filehandle once by shmem
in thread Open Filehandle once by Dunkellbusch

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.