glob

ワイルドカードを使ってファイル名展開する

構文

解説

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.txtREADME.pdf も検索対象になります。