Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister

How to restore from redirecting STDOUT to variable?

by anaconda_wly (Scribe)
on Jan 17, 2013 at 02:36 UTC ( #1013683=perlquestion: print w/replies, xml ) Need Help??
anaconda_wly has asked for the wisdom of the Perl Monks concerning the following question:

I use code below directing output to $output, and I can't see screen display any more. How can I restore from it to a normal state which will print to the screen? I tried close STDOUT but no effect.

close STDOUT; my $output = ""; open(STDOUT, ">", \$output) or die "Can't open STDOUT: $!"; print "test \n";
close STDOUT;//no effect


Replies are listed 'Best First'.
Re: How to restore from redirecting STDOUT to variable?
by choroba (Bishop) on Jan 17, 2013 at 02:45 UTC
    Read open. The examples are there:
    #!/usr/bin/perl use warnings; use strict; open my $save_out, '>&', \*STDOUT or die "Can't dup STDOUT: $!"; close STDOUT; my $output; open STDOUT, '>', \$output or die "Can't open STDOUT: $!"; print "test \n"; close STDOUT; open STDOUT, '>&', $save_out or die "Can't restore STDOUT: $!"; print "Back\n"; print $output;
    لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
      Thanks! What's exactly the "&" means after ">"?

        That you want the file descriptor dup()ed, i.e. get a new file descriptor that refers to the same output stream as STDERR and a Perl-level file handle layered on top of that.

        As the open() perldoc also explains, this is even better written with an '=' after the ampersand:

        open my $save_out, '>&=', \*STDOUT or die "Can't fdopen STDOUT: $!"; open STDOUT, '>&=', $save_out or die "Can't restore STDOUT: $!";
        This avoids creating an all new file descriptor but reuses the system's for a new Perl file handle.

Re: How to restore from redirecting STDOUT to variable?
by Anonymous Monk on Jan 17, 2013 at 03:07 UTC

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1013683]
Approved by choroba
[ambrus]: "you are far more likely to be squished between two other dudes" => wait, really? aren't most planes, weighted by people traveling on it, so narrow that there are only two or three seats on each side of the one corridor, so only one third of the people ge
[ambrus]: t squished between two other people?
holli is about to take the first hit since a month and this weed is strong shit. Should my head explode, someone call 911.
[ambrus]: And even when I traveled on a big plane for a long flight, it had 3 seats, then corridor, then 4 seats, then corridor, then 3 seats, so less than half of the people sit between two other dudes.

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (11)
As of 2017-12-18 13:37 GMT
Find Nodes?
    Voting Booth?
    What programming language do you hate the most?

    Results (486 votes). Check out past polls.