glob関数 - ディレクトリに含まれるファイル一覧を取得
glob関数を使用すると、ファイル一覧を取得することができます。
my @all_files = glob "*";
ファイル一覧を取得するには、glob 演算子を使います。対象は、カレントディレクトリのファイル(ディレクトリを含む)になります。別のディレクトリのファイル一覧を取得したときはchdir関数 で、カレントディレクトリを移動するか、相対パスあるいは、絶対パスで、表現します。
glob の引数の表現例
"*" | .で始まらない、すべてのファイル |
"*.txt" | .txt で終わるファイル |
"*.txt *.pl | .txt あるいは、 .pl で終わるファイル( .txt と .pl の間に空白があります ) |
"* .*" | すべてのファイル( * と .* の間に空白があります ) |
"lib/* | libディレクトリ以下のファイル |
c:/dir/* | 絶対パスで指定 |
空白で、区切ると複数のパターンを指定できます。相対パス以外にも、絶対パスも使うことができます。* はUnixのシェルで用いられるワイルドカードのひとつです。glob関数は、シェルのワイルドカード展開の規則にしたがって、*を含むファイル名を展開します。
サンプル
glob関数のサンプルです。
use strict; use warnings; # カレントディレクトリのファイル一覧を取得する。 # glob print "1: カレントディレクトリのファイル一覧を取得する。\n"; # * は、. で始まらないすべてのファイルを表現 my @all_files = glob "*"; print join("\n", @all_files) . "\n\n"; print "2: .txt で終わるファイル一覧を取得する。\n" ; my @text_files = glob "*.txt"; print join("\n", @text_files) . "\n\n"; print "3: .txt と .pl で終わるファイル一覧を取得する。\n"; # 複数パターンある場合は空白で区切る my @text_and_pl_files = glob "*.txt *.pl"; print join("\n", @text_and_pl_files) . "\n\n"; print "4: 通常ファイルの一覧を取得する。\n"; my @normal_files = glob "*"; # 複雑なことをしたいときは,"*" で # すべてのファイルを取得してから、 # grep で選別する。 @normal_files = grep{ -f $_ } @normal_files; print join("\n", @normal_files) . "\n\n";
参考:join関数
実行結果
1: カレントディレクトリのファイル一覧を取得する。 a.exe a.pl aaa DBIx-Custom dir_20080530_4944 hello.exe hello.pl lib yuki-kimoto-Portablebbs-b578c1d yuki-kimoto-Portablebbs-b578c1d.zip 2: .txt で終わるファイル一覧を取得する。 3: .txt と .pl で終わるファイル一覧を取得する。 a.pl hello.pl 4: 通常ファイルの一覧を取得する。 a.exe a.pl hello.exe hello.pl yuki-kimoto-Portablebbs-b578c1d.zip
Windowsではglob関数は正しく動作しないのでディレクトリハンドルを使う
ファイル一覧を取得するときにglob関数を使うことが多いと思います。けれども今のところはglob関数はWindowsでは正しく動かないと見ておいたほうがよいでしょう。ディレクトリ名に特定の文字列を含む場合は、ファイル一覧を正しく取得することができません。
ですので、glob関数を使う代わりに、以下のようなファイル名の一覧を取得する関数を作るのがよいでしょう。ディレクトリハンドルをオープンするにはopendir関数、ディレクトリの読出しにはreaddir関数を使用します。
sub get_files { my $dir = shift; opendir my $dh, $dir or die qq/Can't open directory "$dir": $!/; my @dirs = map { "$dir/$_" } grep { $_ ne '.' && $_ ne '..' } readdir $dh; return @dirs; }
使い方
my @files = get_files('c:/pictures');