• ベストアンサー

find関数が1階層(カレントディレクトリ)にしか利きません。

find関数が1階層(カレントディレクトリ)にしか利きません。 Active Perl+MS-DOS(WindowsXP)の環境です。 深い階層を持つディレクトリAで  find(\&dirfiletotal,'.'); を実行し、特定のファイル名を検出しています。 なぜかカレントディレクトリ(A)にあるファイルに対してしか動作しません。(結果は正常です。) find関数は再帰的、つまり下の階層も含めてファイル検出するのだと思っていましたが、間違いでしょうか? もし間違いであれば、どのように書き変えればいいか、ヒントをいただけると大変助かります。 どうぞ宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

訂正 next EACH_FILES; if $_ =~ /^\.+$/; ↓ next EACH_FILES if $_ =~ /^\.+$/;

rosafilipes
質問者

お礼

_--_1l1_1_様、 懇切丁寧に教えてくださいまして、本当にありがとうございました。 日本語ではNGかも、というポイントは目からウロコでした。 言われてみれば、でやっと思い当たりました。 今後こういうことが起こった時には、まずそれを検証してみます。 いただいたスクリプトのお手本を参考に、勉強しながらさっそく使わせていただきます。 本当にありがとうございます。 大変助かりました!

その他の回答 (1)

回答No.1

File::Findのfindですね。再帰的にファイル階層を辿りますよ。Active Perl は使ったことないですが、フォルダ名が日本語とかダメなんですかね。もしそうでしたら、英数字のみのフォルダとファイル名で試したらでどうでしょうか? あとは自分で作ってみるとか。(以下、空白を全角にしていることに注意) use File::Spec; use File::Basename; my $dir = shift || '.'; my @files = find_files($dir); print $_, $/ for @files; sub find_files {   my ($dir)   = @_;   my $base_name = fileparse($dir);   my @files   = ();   # skip .. ... etc   if ( $base_name =~ /^\.\.+$/ ) {     return ();   }   opendir my $dh, $dir or die "$!:$dir"; EACH_FILES:   for ( readdir $dh ) {     # skip . .. ... etc     next EACH_FILES;     if $_ =~ /^\.+$/;     my $file = File::Spec->catfile( $dir, $_ );     if ( -d $file ) {       push @files, find_files($file);     }     else {       push @files, $file;     }   }   closedir $dh or die "$!:$dir";   return @files; }

関連するQ&A