in reply to Re^3: Can't close STDIN/STDOUT/STDERR
in thread Can't close STDIN/STDOUT/STDERR

close(READER) or die "can't close READER: $!"; open STDIN, '<', '/dev/null' or die "can't open STDIN: $!\n"; open STDOUT, '>', '/dev/null' or die "can't open STDOUT: $!\n"; open STDERR, '>&', \*STDOUT' or die "can't dup STDOUT: $!\n";

Replies are listed 'Best First'.
Re^5: Can't close STDIN/STDOUT/STDERR
by 7stud (Deacon) on Feb 10, 2010 at 02:09 UTC

    What does this syntax do:

    open STDERR, '>&', \*STDOUT'

    because this simpler syntax seems to work:

    1 use strict; 2 use warnings; 3 use 5.010; 4 5 open my $SAVE_STDOUT, '>&', 'STDOUT'; #<--quoted bareword 6 open STDOUT, '>', 'data1.txt'; 7 say 'hello world'; 8 9 open my $SAVE_STDERR, '>&', 'STDERR'; #<--quoted bareword 10 open STDERR, '>', 'errors.txt'; 11 warn "my warning message"; 12 13 open STDOUT, '>&', $SAVE_STDOUT; 14 open STDERR, '>&', $SAVE_STDERR; 15 say 'goodbye'; 16 warn 'my warning message #2'; --output:-- goodbye my warning message #2 at 2perl.pl line 16. $cat data1.txt hello world $cat errors.txt my warning message at 2perl.pl line 11.
    EDIT: In fact, I just tried using STDOUT and STDERR as the third argument to open() without quotes around them, and that works too: the output is the same.

      Then go for it. Some functions have funky parsing rules that accept barewords. Some functions accept the names of file handles. This is has does both.

      However, I disagree that passing a file handle* to a function that expects a file handle is somehow more complex than passing the name of the file handle you want to pass. (I should have used *STDOUT, though. There was no need to take a reference, although references to glob work a bit more often than just globs.)

      By the way, the real name for "quoted bareword" is "quoted string literal" or (laxly) "quoted string".

      * — Well, technically, the file handle is obtained by dereferencing *STDOUT{IO}, but *STDOUT is one step closer than 'STDOUT'.