ファイル検索イテレータ Find::File::Iterator って便利かも?

Perl でディレクトリ一覧を取得するとき、File::Find を使ったり、opendir でゴリゴリ書いたりってのが普通だったりしませんか?Perl 標準だけで書けるので。僕の場合は、配布用 CGI とかは、File::Find を使って、それ以外では自前のモジュールって感じで使っていました。

で、最近 File::Find::Iterator を今更ながら知りました。なんか 2003 年でメンテナンスが止まっているっぽいですが、なかなか優れもののモジュールです。ソースを見ると File::Find を継承したものではなく、Class::Iterator を継承して IO::Dir 使って書かれてます。今、Author をよく見たら作者が同じだった・・・。

- スポンサーリンク -

File::Find を使った場合は、

use File::Find;
our @files;
our @dirs; find(\&isdir,'./');
find(\&isfile,'./'); map{ print "$_\n"; } @files; sub isfile { push(@files,$File::Find::name) if(-f); }
sub isdir { push(@dirs,$File::Find::name) if(-d); }

なんて感じで、ファイルやディレクトリの一覧を取得するのですが、グローバル変数を用意しないといけないってのがどうにもダサいです。

一方、File::Find::Iterator で書くと、

use File::Find::Iterator;
my $dirs = File::Find::Iterator->create(dir => ["./"], filter => \&isfile);
my $files= File::Find::Iterator->create(dir => ["./"], filter => \&isdir); while (my $f = $files->next) { print "file : $f\n" } sub isfile { -f }
sub isdir { -d }

と使い勝手が良いです。ただし、速度的には File::Find の方が高速なようで、簡単なベンチマークをとったところ、File::Find::Iterator の方が4倍程度も遅かったです・・・う〜ん、微妙だなぁ〜

File::Find でググッてみたら、「MT::Neko::kak 500 Internal Server Error:File::FindとFile::Finder」って記事を見つけまして、File::Finder なるモジュールもあるようです。File::Finder のソースを見たら、こちらは File::Find のラッパーになっているようです。こっちの方がいいかも・・・。

File::Find::Iterator の日本語訳は Perldoc.jp にあります。
http://perldoc.jp/docs/modules/File-Find-Iterator-0.3/Iterator.pod

- スポンサーリンク -