Perlでディレクトリ内の各ファイルを再帰的に処理する関数
あるディレクトリ内を再帰的に処理し、その結果を変数の中に詰め込む関数を作ってみました。
sub recursive { my ( $base_dir, $result, $function ) = @_; my( @files ); @files = glob( $base_dir.'/*' ); for my $file_name ( @files ){ if ( -d $file_name ){ # process recursively recursive( $file_name, $result, $function ); } elsif ( -f $file_name ){ # process file $result = &$function($file_name,$result); } } }こんな感じで使えます。
package Hoo; use strict; sub recursive { my ( $base_dir, $result, $function ) = @_; my( @files ); @files = glob( $base_dir.'/*' ); for my $file_name ( @files ){ if ( -d $file_name ){ # process recursively recursive( $file_name, $result, $function ); } elsif ( -f $file_name ){ # process file $result = &$function($file_name,$result); } } } package Foo; my $result = []; my $func = sub { my ($file_name,$result) = @_; push @$result, "$file_name!!\n"; return $result; }; # Users/myself/hogeの下に1.txt, 2.txt, 3/1.txtというファイルがあったと仮定 Hoo::recursive("/Users/myself/hoge",$result, $func); print $_ for @$result; # /Users/myself/hoge/1.txt!! # /Users/myself/hoge/2.txt!! # /Users/myself/hoge/3/1.txt!!