ワイルドカードを使ってファイル名展開する
glob は、リストコンテキストでは、EXPR の値でファイル名展開した結果をリストで返します。
UNIX の Bash のシェルのファイル名展開のようなものです。
Bash のファイル名展開とは、ワイルドカード * を使ってパターンに一致するファイル名のリストを取り出すことです。
たとえば、ls ./*.txt を実行すると、拡張子が .txt のファイルの一覧を出力します。
これと同様に、glob は引数に ./*.txt を与えると、カレントディレクトリから
拡張子が .txt のファイルのリストを返します。
my @files = glob('./*.txt');
もしカレントディレクトリに sample1.txt, sample2.txt, sample3.txt
の 3 つのテキストファイルが存在すると、配列 @files には
"./sample1.txt", "./sample2.txt",
"./sample3.txt"
が格納されます。
EXPR には、2 つ以上のパターンを同時に指定することもできます。
次の例は、.txt に加え .pdf のファイルも対象になります。
my @files = glob('./*.txt ./*.pdf');
glob は、スカラーコンテキストでは、ファイル名展開の結果を順に処理し、そのリストの処理が終わったら
undef を返します。
スカラーコンテキストは、while などのループで使うと便利です。
while ( my $fname = glob('./*.txt') ) {
print $fname, "\n";
}
glob は、次のような < と > を区切り文字に使った代替構文もサポートしています。
しかし、この構文がサポートされているとはいえ、可読性や検索性を考えると glob を使うことをお勧めします。
なお、この代替構文は、glob とは異なり、複数のパターンを指定することはできません。
my @files = <'./*.txt'>;
もしファイル検索で大文字と小文字を区別したくない場合は、
File::Glob の
:nocase
パラメータを使うと良いでしょう。
use File::Glob qw(:globally :nocase);
my @files = glob('readme*');
上記コードは、ReadMe.txt も README.pdf も検索対象になります。