Book HomeLearning Perl, 3rd EditionSearch this book

12.3. An Alternate Syntax for Globbing

Although we use the term globbing freely, and we talk about the glob operator, you might not see the word glob in very many of the programs that use globbing. Why not? Well, most legacy code was written before the glob operator was given a name. Instead, it was called up by the angle-bracket syntax, similar to reading from a filehandle:

my @all_files = <*>; ## exactly the same as my @all_files = glob "*";

The value between the angle brackets is interpolated similar to a double-quoted string, which means that Perl variables are expanded to their current Perl values before being globbed:

my $dir = "/etc";
my @dir_files = <$dir/* $dir/.*>;

Here, we've fetched all the non-dot and dot files from the designated directory, because $dir has been expanded to its current value.

So, if using angle brackets means both filehandle reading and globbing, how does Perl decide which of the two operators to use? Well, a filehandle has to be a Perl identifier. So if the item between the angle brackets is strictly a Perl identifier, it's a filehandle read; otherwise, it's a globbing operation. For example:

my @files = <FRED/*>;   ## a glob
my @lines = <FRED>;    ## a filehandle read
my $name = "FRED";
my @files = <$name/*>; ## a glob

The one exception is if the contents are a simple scalar variable (not an element of a hash or array), then it's an indirect filehandle read,[278] where the variable contents give the name of the filehandle to be read:

[278]If the indirect handle is a text string, then it's subject to the "symbolic reference" test that is forbidden under use strict. However, the indirect handle might also be a typeglob or reference to an IO object, and then it would work even under use strict.

my $name = "FRED";
my @lines = <$name>; ## an indirect filehandle read of FRED handle

Determining whether it's a glob or a filehandle read is made at compile time, and thus it is independent of the content of the variables.

If you want, you can get the operation of an indirect filehandle read using the readline operator,[279] which also makes it clearer:

[279]If you're using Perl 5.005 or later.

my $name = "FRED";
my @lines = readline FRED;  ## read from FRED
my @lines = readline $name; ## read from FRED

But the readline operator is rarely used, as indirect filehandle reads are uncommon and are generally performed against a simple scalar variable anyway.



Library Navigation Links

Copyright © 2002 O'Reilly & Associates. All rights reserved.