end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

perlでファイル探索なら、File::FindよりFile::Find::Ruleかも

http://perl-mongers.org/2008/05/opendirglobfilefindrule.html

これまでは、ファイルを探す際、File::Findを使って再帰的に処理していましたが、
glob()、またはFile::Find::Ruleを使うといいかも

http://search.cpan.org/perldoc?File::Find::Rule

以前、ファイル探索を実装した際は、File::Findを使って次のように書いていました。
この書き方では、globalな@SHARED_LISTに探索結果を格納する為、本来?のFile::Findの使い方とは異なると思います。

use File::Find;

my @SHARED_LIST = ();	#送信対象のfile,dir一覧
my $LOCAL_DIR;		#送信対象となるlocal dir

sub sync_shared_dir {
    my ($self,$ftp,$local_dir) = @_;

    #find()から呼ばれるwanted()に引数を渡せないようなので
    $LOCAL_DIR = $local_dir;
    #shared dir以下のfile,dir一覧を作成
    @SHARED_LIST = ();
    find( \&wanted, "$local_dir/$CONF->{baitai}->{shared_dir}");
}

sub wanted {
    $File::Find::name =~ s/^$LOCAL_DIR\///;
    #開発環境において、.svnがある場合、ftpの送信対象にはしません
    if ( $File::Find::name =~ /\/\.svn$/o or
	 $File::Find::name =~ /\/\.svn\//o){
	return undef;
    }
    push(@SHARED_LIST,$File::Find::name);
}

そんな時に見かけたのが次のurl.
http://perl-mongers.org/2008/05/opendirglobfilefindrule.html
なるほど