open FILEHANDLE, MODE, EXPR
EXPR is the (name of the) file to be opened. But sometimes you need to specify, not a file, but an existing filehandle (i.e., a scalar variable pointing to an opened file). This is done by appending & to the MODE (>, >>, <, +>, +>>, or +<), which tells open to treat what follows as a filehandle and make a copy (“dup”) of it.
This is documented in open, as referenced by choroba. See also, e.g., http://www.kernel.org/doc/man-pages/online/pages/man2/dup.2.html.
Hope that helps,
| [reply] [d/l] [select] |
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. | [reply] [d/l] [select] |