Learning Perl, 5th Edition
12.2. 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 expanded it. This works 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 $
show-args didn't need to know anything about globbingthe names were already expanded in @ARGV. Sometimes we end up with a pattern such as *.pm inside our Perl program. Can we expand this pattern into the matching filenames without working hard? Surejust 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, like the shell. And @pm_files gets the same list as we got before by using *.pm on the command line. Anything you can say on the command line, you can 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 with a dot as well as the ones that don't. The space between these two items inside the quoted string is significant since it separates two different items you want to glob.[*] The reason this works as the shell does is that prior to Perl Version 5.6, the glob operator called /bin/csh[ [*] Windows users may be accustomed to using a glob of *.* to mean "all files," but that means "all files with a dot in their names," even in Perl on Windows. [ |