select FILEHANDLE
select
For historical reasons, there are two select
operators that are totally unrelated to each other. See the next section for
the other one. This select operator returns
the currently selected output filehandle, and if
FILEHANDLE
is supplied, sets the current default
filehandle for output. This has two effects: first, a write or a print
without a filehandle will default to this FILEHANDLE
.
Second, special variables related to output will refer to this output
filehandle. For example, if you have to set the same top-of-form format for
more than one output filehandle, you might do the following:
select REPORT1; $^ = 'MyTop'; select REPORT2; $^ = 'MyTop';
But note that this leaves REPORT2
as the currently selected
filehandle. This could be construed as antisocial, since it could really foul
up some other routine's print or write statements. Properly written library
routines leave the currently selected filehandle the same on exit as it was upon
entry. To support this, FILEHANDLE
may be an
expression whose value gives the name of the actual filehandle. Thus, you can
save and restore the currently selected filehandle:
my $oldfh = select STDERR; $| = 1; select $oldfh;
or (being bizarre and obscure):
select((select(STDERR), $| = 1)[0])
This example works by building a list consisting of the returned value from
select(STDERR)
(which selects STDERR
as a
side effect) and $| = 1
(which is always 1), but sets
autoflushing on the now-selected STDERR
as a side effect.
The first element of that list (the previously selected filehandle) is now used
as an argument to the outer select.
Bizarre, right? That's what you get for knowing just enough Lisp to be
dangerous.
However, now that we've explained all that, we should point out that you rarely
need to use this form of select nowadays,
because most of the special variables you would want to set have object-oriented
wrapper methods to do it for you. So instead of setting $|
directly, you might say:
use FileHandle; STDOUT->autoflush(1);
And the earlier format example might be coded as:
use FileHandle; REPORT1->format_top_name("MyTop"); REPORT2->format_top_name("MyTop");