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

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.

Replies are listed 'Best First'.
Re^6: Can't close STDIN/STDOUT/STDERR
by ikegami (Patriarch) on Feb 10, 2010 at 03:36 UTC

    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'.