Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re (tilly) 1: Redirecting STDOUT to a variable via eval?

by tilly (Archbishop)
on Feb 12, 2001 at 08:52 UTC ( [id://57840]=note: print w/replies, xml ) Need Help??


in reply to Redirecting STDOUT to a variable via eval?

Just a quick hack, requires 5.004 or better:
use IO::Scalar; sub var_eval { local *FH; my $fh; tie (*FH, 'IO::Scalar', \$fh); $saved = select FH; eval shift; select $saved; $fh; }
UPDATE
This requires (obviously) IO::Scalar.

Replies are listed 'Best First'.
Re (tilly) 1: Redirecting STDOUT to a variable via eval?
by mr.nick (Chaplain) on Feb 12, 2001 at 09:51 UTC
    Hm. This seems to act strangely. It appears that anything externally spawned from the eval's block doesn't inherit the new STDOUT (which is what the select $fh sets, correct?). For example, the following doesn't work
    $eval='system("ls")'; $result=var_eval($eval);
    I'm not overly concerned about this, but am kind of curious as to why it works this way. I can't seem to wrap my brain around "why?".
      That is because tie only is working on Perl IO. A system command hands the file descriptor for STDOUT to the command being launched, which knows nothing about Perl's IO.

      The same gotcha exists for working with C extensions that do their own printing.

      For one solution you can do a piped open like this:

      use IPC::Open3; sub piped_cmd { local *TO; local *FROM; open3 (\*TO, \*FROM, \*FROM, "perl") or die "Cannot launch perl: $!" +; print TO @_, "\n__END__\n"; local $/; <FROM>; }
      (That is portable, Windows and Unix.)

      Note that doing things that way does not give access to various things that you have defined in your script. If you want that you are probably out of luck because all of the methods that I know of for IO games (select, tie, etc) work at the Perl level, and leave the C file-descriptors alone. But then when you call system the program works by file descriptor. :-(

      This could be construed as a bug.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://57840]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (4)
As of 2024-04-24 06:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found