如何将结果从Find :: File存储到数组

时间:2019-06-27 06:11:21

标签: perl

我想在目录和子目录中列出文件。我使用perl File :: Find。我可以将结果存储到数组中吗?

这是代码

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

my $location="tmp";

sub find_txt {
    my $F = $File::Find::name;

    if ($F =~ /txt$/ ) {
       push @filelist, $F;
       return @filelist;
    }
}


my @fileInDir = find({ wanted => \&find_txt, no_chdir=>1}, $location);
print OUTPUT @fileInDir

上面的代码不显示输出

3 个答案:

答案 0 :(得分:3)

当然,只需push到在外部声明的数组中即可:

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

my $location = "tmp";

my @results;
my $find_txt = sub {
    my $F = $File::Find::name;

    if ($F =~ /txt$/ ) {
        push @results, $F;
    }
};


find({ wanted => $find_txt, no_chdir=>1}, $location);
for my $result (@results) {
    print "found $result\n";
}

wanted回调is ignored的返回值。 find本身也没有记录或有用的返回值。

答案 1 :(得分:1)

对于后代,使用Path::Iterator::Rule更简单。

use strict;
use warnings;
use Path::Iterator::Rule;

my $location = 'tmp';
my $rule = Path::Iterator::Rule->new->not_dir->name(qr/txt$/);
my @paths = $rule->all($location);

答案 2 :(得分:0)

替换

my @fileInDir = find({ wanted => \&find_txt, no_chdir=>1}, $location);

使用

my @fileInDir;
find({ wanted => sub { push @fileInDir, find_txt(); }, no_chdir=>1 }, $location);

并添加缺少的内容

return;

aka

return ();

find_txt。与先前答案中的解决方案不同,这使您可以使用可重复使用且位置方便的“所需”子。