The earliest edition of the Llama Book is from 1993, before lexical filehandles were part of the Perl language. Lexical filehandles are a better practice for a variety of reasons. The most important disadvantages of typeglobs are
-
they are always global in scope, which can lead to insidious bugs like this one:
sub doSomething { my ($input) = @_; # let's compare $input to something we read from another file open(F, "<", $anotherFile); @F = <F>; close F; do_some_comparison($input, @F); } open(F, "<", $myfile); while (<F>) { doSomething($_); # do'h -- just closed the F filehandle } close F;
-
they are harder to pass to a subroutine than a lexical filehandle
package package1; sub log_time { # print timestamp to filehandle my ($fh) = @_; print $fh scalar localtime, "\n"; } package package2; open GLOB, '>', 'log1'; open $lexical, '>', 'log2'; package1::log_time($lexical); # works as expected package1::log_time(GLOB); # doesn't work package1::log_time('GLOB'); # doesn't work package1::log_time(*GLOB); # works package1::log_time(package2::GLOB); # works package1::log_time('package2::GLOB'); # works
See also: Why is three-argument open calls with autovivified filehandles a Perl best practice?