Handle References
References to filehandles or directory handles can be created by referencing the typeglob of the same name:
splutter(\*STDOUT);
sub splutter {
my $fh = shift;
say $fh "her um well a hmmm";
}
$rec = get_rec(\*STDIN);
sub get_rec {
my $fh = shift;
return scalar <$fh>;
}If you’re passing around filehandles, you can also use the
bare typeglob to do so: in the example above, you could have used
*STDOUT or *STDIN instead of \*STDOUT and \*STDIN.
Although you can usually use typeglobs and references to typeglobs interchangeably,
there are a few places where you can’t. Simple typeglobs can’t be
blessed into objectdom, and
typeglob references can’t be passed back out of the scope of a
localized typeglob.
When generating new filehandles, older code would often do something like this to open a list of files:
for $file (@names) {
local *FH;
open(*FH, $file) || next;
$handle{$file} = *FH;
}That still works, but it’s often preferable to let an undefined variable autovivify an anonymous typeglob:
for $file (@names) {
my $fh;
open($fh, $file) || next;
$handle{$file} = $fh;
}Anytime you have a variable that contains a filehandle instead of a bareword handle, you have an indirect filehandle. It doesn’t matter whether you use strings, typeglobs, references to typeglobs, or one of the more exotic I/O objects. You just use a scalar that—one way or another—gets interpreted as a filehandle. For most purposes, you can use either a typeglob or a typeglob reference almost indiscriminately. As ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access