You can find samples of how to redirect file handles in open:
open STDOUT, '>', "/dev/null" or die "Can't redirect STDOUT: $!"; | [reply] [d/l] |
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";
| [reply] [d/l] |
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. | [reply] [d/l] |
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'.
| [reply] [d/l] [select] |