Perl、グロブ(glob) 関数の例


通常、シェルは、コマンドラインで指定されたすべてのファイル名パターンを、それにマッチするファイル名に展開します。
これを「グロブ(glob)」といいます。
例えば、echoコマンドに、ファイル名パターン*.pmを与えると、シェルは、それをマッチする名前のリストに展開します。

$ echo *.pm
barnet.pm dino.pm fred.pm wilma.pm
$

echoコマンドは*.pmの展開についてはまったく知る必要はありません。
なぜならすでにシェルがそれを展開しているからです。
あたなのPerlプログラムも同じように扱われます。

$ cat >show-args
foreach $arg (@ARGV){
  print “one arg is $arg\n”;
}
^D
$ perl show-args *.pm
one arg is barney.pm
one arg is dino.pm
one arg is fred.pm
one arg is wilma,pm
$


あなたが書いたPerlプログラムshow-argsは、グロブについて意識する必要がないという点に注意してください、@ARGVにはすでに展開済みのファイル名が入っているのです。
しかし、時には、Perlプログラムの中で*.pmのようなパターンを展開したいこともあります。
それはもちろん可能です、それにはglob関数を使います。

my @all_files = glob “*”;
my @pm_files = glob “*.pm”;

この例では、@all_filesには、作業ディレクトリのすべてのファイル名をアルファベット順に並べたもの、「ただし、シェルと同様に、ドットで始まるファイルは除外されます」がセットされます。
また@pm_filesには、コマンドラインで@.pmによって得られるものと同じリストがセットされます。

事実、コマンドラインで指定できるあらゆるパターンを、globの引数に指定することができます。
パターンが複数ある場合には、スペースで区切って指定します。

my @all_files_incliding_dot = glob *.* *”;

この例では、ドット以外で始まるファイル名に加えて、ドットで始まるファイル名も得るために.*というパターンをパラメータに追加しています。
このダブルクォート文字列の中で.*と*の間に置かれたスペースは、グロブするこれら2つのパターンを分離するためのものなので、省略することはできません。

Perl5.6より古いバージョンのPerlにおいては、glob演算子がシェルとまったく同じ結果を返すのは、globがファイル名を展開するために、見えないところで/bin/cshをそのまま呼び出していたためです。
そのために、大量のファイルが存在するディレクトリでは時間がかかり、また実行が止まるおそれがありました。
そのために良心的なPerlハッカーたちは、グロブを使うことを避けて、もっぱらディレクトリハンドルを使っていました。
しかし、最近のバージョンのPerlを使っているなら、もうこのようなことを心配する必要はありません。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です