ワイルドカードを使ってファイル名展開する
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
も検索対象になります。