Как сохранить результат из Find :: File в массив - PullRequest
0 голосов
/ 27 июня 2019

Я хочу перечислить файл в каталоге и подкаталоге. Я использую 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 ]

3 голосов
/ 27 июня 2019

Конечно, просто 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 игнорируется . find само по себе не имеет документированного или полезного возвращаемого значения.

1 голос
/ 27 июня 2019

Для потомков это гораздо проще с 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);
0 голосов
/ 27 июня 2019

Замените

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,В отличие от решения, приведенного в предыдущем ответе, это позволяет использовать многоразовые и удобно расположенные «нужные» сабвуферы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...