Globbing
Normally, the shell expands any filename patterns on each command
line into the matching filenames. This is called
globbing. For example, if you give a filename
pattern of *.pm to the echo command, the shell expands this
list to a list of names that match:
$ echo *.pm barney.pm dino.pm fred.pm wilma.pm $
The echo command doesn’t have to know
anything about expanding *.pm because
the shell has already expanded it. This works even for your Perl
programs:
$ cat >show-args
foreach $arg (@ARGV) {
print "one arg is $arg\n";
}
^D
$ perl show-args *.pm
one arg is barney.pm
one arg is dino.pm
one arg is fred.pm
one arg is wilma.pm
$Note that show-args didn’t need to know
anything about globbing—the names were already expanded in @ARGV.
But sometimes we end up with a pattern like *.pm inside our Perl program. Can we expand
this pattern into the matching filenames without working very hard?
Sure—just use the glob operator:
my @all_files = glob "*"; my @pm_files = glob "*.pm";
Here, @all_files gets all the
files in the current directory, alphabetically sorted, and not including
the files beginning with a period, just like the shell. And @pm_files gets the same list that we got
before by using *.pm on the command
line.
In fact, anything you can say on the command line, you can also
put as the (single) argument to glob,
including multiple patterns separated by spaces:
my @all_files_including_dot = glob ".* *";
Here, we’ve included an additional “dot star” parameter to get the filenames that begin ...