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 ...
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