Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. 標準関数
  3. here

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');
  • Perlとはテキスト処理の記述性とパフォーマンスに優れ、正規表現が言語に組み込まれているプログラミング言語です。
  • Linuxサーバーでのフィルタリングプログラム、複数行の文字列を処理、ファイル内容の検索・置換などが得意
  • Perlはgitopensslなど広く普及したUnix/Linuxミドルウェアの補助ツールとして採用実績あり。後方互換性とポータビリティの高さがひとつの理由と推測。
  • 大量のテキストを扱うWeb開発も得意。ロングテールSEOを意識したWebサイト、アドテクやソーシャルゲームでの50ms以内のJSONの生成など。