アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (2件)

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;
}
    • good
    • 0

訂正



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

next EACH_FILES if $_ =~ /^\.+$/;
    • good
    • 0
この回答へのお礼

_--_1l1_1_様、

懇切丁寧に教えてくださいまして、本当にありがとうございました。
日本語ではNGかも、というポイントは目からウロコでした。
言われてみれば、でやっと思い当たりました。
今後こういうことが起こった時には、まずそれを検証してみます。

いただいたスクリプトのお手本を参考に、勉強しながらさっそく使わせていただきます。
本当にありがとうございます。
大変助かりました!

お礼日時:2010/07/20 00:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!