1

したがって、本質的に私がやろうとしているのは、ディレクトリを調べて、すべてのファイル (この場合はサブ searchForErrors) に対してアクションを実行することです。このサブは動作します。私がこれまでに持っているものは次のとおりです。

sub proccessFiles{
    my $path = $ARGV[2];

    opendir(DIR, $path) or die "Unable to open $path: $!";
    my @files = readdir(DIR);
    @files = map{$path . '/' . $_ } @files;
    closedir(DIR);

    for (@files){
        if(-d $_){
            process_files($_);
        }
        else{
        searchForErrors;
    }
}
}

proccessFiles($path);

どんな助け/提案も素晴らしいでしょう。繰り返しますが、私は Perl を初めて使用するので、説明が多ければ多いほどよいでしょう。ありがとうございました!

4

3 に答える 3

11

File::Find車輪の再発明を試みる代わりに、モジュールを使用する必要があります。

use strict;
use warnings;
use File::Find;

my @files;
my $start_dir = "somedir";  # top level dir to search
find( 
    sub { push @files, $File::Find::name unless -d; }, 
    $start_dir
);
for my $file (@files) {
    searchForErrors($file); 
}

現在のコードの問題は、再帰検索にディレクトリ...ディレクトリを含めていることです。これにより、エラーが発生することは間違いありませんdeep recursion

于 2012-06-08T16:29:40.583 に答える
3

Path::ClassTLPの解決策に加えて解決策を示すことは有用だと思いましたFile::Find

これはほとんど自明だと思います。

use strict;
use warnings;

use Path::Class 'dir';

my $root = dir 'C:\path\to\root';

$root->recurse(callback => sub {
  my $file = shift;
  searchForErrors($file) unless $file->is_dir;
});
于 2012-06-08T17:55:40.443 に答える
1

File::Find多くのメモリを使用せずに使用するより良い方法は次のとおりです。

use strict; use warnings;
use File::Find;

find(
    sub { 
        searchForErrors($File::Find::name) unless -d
    }, 
    "/tmp/"
);

これはイテレータ スタイルです。

于 2012-06-09T09:15:19.773 に答える