基本上我要做的就是浏览目录并对所有文件执行操作,在本例中为子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的新手,所以解释越多越好。谢谢!
答案 0 :(得分:10)
您应该使用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
错误。
答案 1 :(得分:2)
我认为除了TLP的Path::Class
之外,显示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;
});
答案 2 :(得分:1)
使用File::Find
而不使用大量内存的更好方法是:
use strict; use warnings;
use File::Find;
find(
sub {
searchForErrors($File::Find::name) unless -d
},
"/tmp/"
);
这是更多的迭代器风格。