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::Class我认为除了 TLP 的解决方案之外,展示一个解决方案会很有用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 回答