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");