Globbing, or Getting a List of Filenames Matching a Pattern
Problem
You want to get a list of filenames similar to MS-DOS’s
*.*
and Unix’s *.h
(this
is called globbing).
Solution
Perl provides globbing with the semantics of the Unix C shell through
the glob
keyword and < >:
@list = <*.c>; @list = glob("*.c");
You can also use readdir
to extract the filenames
manually:
opendir(DIR, $path); @files = grep { /\.c$/ } readdir(DIR); closedir(DIR);
The CPAN module File::KGlob does globbing without length limits:
use File::KGlob; @files = glob("*.c");
Discussion
Perl’s built-in glob
and <WILDCARD>
notation (not to be confused with <FILEHANDLE>) currently use
an external program to get the list of filenames on most platforms.
This program is csh on Unix,[16] and a
program called dosglob.exe on Windows. On VMS
and the Macintosh, file globs are done internally without an external
program. Globs are supposed to give C shell semantics on non-Unix
systems to encourage portability. The use of the shell on Unix also
makes this inappropriate for setuid scripts.
To get around this, you can either roll your own selection mechanism
using the built-in
opendir
or CPAN’s
File::KGlob, neither of which uses external programs. File::KGlob
provides Unix shell-like globbing semantics, whereas
opendir
lets you select files with Perl’s
regular expressions.
At its simplest, an opendir
solution uses
grep
to filter the list returned by
readdir
:
@files = grep { /\.[ch]$/i } readdir(DH);
You could also do this with the DirHandle ...
Get Perl Cookbook 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.