... so Symbol::gensym is technically no longer needed

But there are times when it's still useful... like when you want open3() to keep STDOUT and STDERR separate (by default, if you pass it undef for both STDOUT and STDERR, STDERR will be directed to the same filehandle that's created for STDOUT)

#!/usr/bin/env perl use warnings; use strict; use IPC::Open3; use Symbol qw(gensym); use POSIX qw(:sys_wait_h); # I'm sometimes using perl 5.8.5, so //'<undef>' unavailable # verified later on 5.14.2 sub defor($) { defined($_[0]) ? $_[0] : '<undef>' } foreach my $run (1..3) { my ($out, $err) = ('',''); my ($fhi, $fho, $fhe) = ($run == 1) ? (undef, undef, undef) : # when fhe==un +def goes to open3, STDERR will be redirected to STDOUT ($run == 2) ? (undef, undef, gensym) : # this keeps S +TDERR and STDOUT separate (gensym, gensym, gensym) ; # as does this +, the first two gensym are unecessary, but the third is needed my $pid = open3( $fhi, $fho, $fhe, qq[cat - ; perl -le 'print STDE +RR "this should be STDERR (run#$run)...\nand so should this (run#$run +)\n"'] ); print { $fhi } "[run#$run] This should be STDOUT\n"; close($fhi); $out .= join '', map { s/^/STDOUT> / if $_ ne $/; $_ } readline($f +ho) if defined $fho; $err .= join '', map { s/^/STDOUT> / if $_ ne $/; $_ } readline($f +he) if defined $fhe; print "Read STDOUT:\n$out\n" if length($out); print "Read STDERR:\n$err\n" if length($err); printf "run#%d --- fhi='%s' fho='%s' fhe='%s'\n", $run, defor $fhi +, defor $fho, defor $fhe; print "="x75, "\n\n"; } __END__ Read STDOUT: STDOUT> [run#1] This should be STDOUT STDOUT> this should be STDERR (run#1)... STDOUT> and so should this (run#1) run#1 --- fhi='GLOB(0x92fdba4)' fho='GLOB(0x92fdbcc)' fhe='<undef>' ====================================================================== +===== Read STDOUT: STDOUT> [run#2] This should be STDOUT Read STDERR: STDOUT> this should be STDERR (run#2)... STDOUT> and so should this (run#2) run#2 --- fhi='GLOB(0x93811c0)' fho='GLOB(0x932bc60)' fhe='GLOB(0x92fd +ba4)' ====================================================================== +===== Read STDOUT: STDOUT> [run#3] This should be STDOUT Read STDERR: STDOUT> this should be STDERR (run#3)... STDOUT> and so should this (run#3) run#3 --- fhi='GLOB(0x93811c0)' fho='GLOB(0x932bc60)' fhe='GLOB(0x92fd +ba4)' ====================================================================== +=====

Yes, I know the OP didn't include open3, but since I was recently learning the ins and outs of open3 filehandles, I thought I'd mention this exception to your general rule, for posterity's sake.


In reply to Re^5: Looking for suitable spells to get open to return a filehandle from a module by pryrt
in thread SOLVED: Looking for suitable spells to get open to return a filehandle from a module by talexb

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.