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 globbing—the 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? 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, 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. ...

Get Learning Perl, Fourth Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.