所以对于我正在编写的程序,我想做的是搜索目录中的所有子目录。如果子目录名称包含一个单词,比如说“foo”,那么程序将打开这个子目录并对子目录中的文件执行一个功能。有人可以帮我解决这个问题吗?它还需要是递归的。提前致谢
问问题
830 次
1 回答
3
这可以使用File::Find
模块来完成,但我相信Path::Class
即使它不是核心模块并且可能需要安装,它也很出色。
这个程序找到想要的文件并调用process
来处理它们。目前,process
子程序只是打印文件名进行测试。
use strict;
use warnings;
use Path::Class;
my $dir = dir '/path/to/root/directory';
$dir->recurse(callback => sub {
my $node = shift;
return if $node->is_dir;
my $parent = $node->parent;
if ($parent->basename =~ /foo/) {
process($node);
}
});
sub process {
my $file = shift;
print $file, "\n";
}
更新
如果您愿意,该程序使用File::Find
.
use strict;
use warnings;
use File::Find;
use File::Basename qw/ basename /;
my $dir = '/path/to/root/directory';
find(sub {
return unless -f;
if (basename($File::Find::dir) =~ /foo/) {
process($File::Find::name);
}
}, $dir);
sub process {
my $file = shift;
print $file, "\n";
}
更新
Path::Class::Rule
根据要求,这是用于比较的进一步解决方案。正如daxim建议的那样,代码要短一些。
use strict;
use warnings;
use Path::Class::Rule;
my $rule = Path::Class::Rule->new;
$rule->file->and(sub { $_->parent->basename =~ /foo/ });
my $next = $rule->iter('/path/to/root/directory');
while ( my $file = $next->() ) {
process($file);
}
sub process {
my $file = shift;
print $file, "\n";
}
于 2012-07-02T17:37:25.000 回答