Вы можете использовать File :: Find.
use File::Find qw( find );
my @dir_qfns = qw( FolderA );
find(
sub {
# Don't do anything for a base dir.
return if $_ eq '.';
# Don't recurse.
$File::Find::prune = 1;
stat($_)
or do {
warn("Skipping \"$_\": Can't stat: $!\n");
next;
};
-f _
or return;
/\.txt\z/
or return;
# ... do something with $File::Find::name/$_ ...
},
@dir_qfns,
);
С File :: Find :: Rule намного проще. (Разве это не всегда?)
use File::Find::Rule qw( );
my @dir_qfns = qw( FolderA );
for my $qfn (
File::Find::Rule
->mindepth(1)
->maxdepth(1)
->file
->name("*.txt")
->in(@dir_qfns)
) {
# ... do something with $qfn ...
}
Вы также можете сделать это, используя glob
.
my @dir_qfns = qw( FolderA );
for my $dir_qfn (@dir_qfns) {
for my $fn (glob("\Q$dir_qfn\E/*.txt")) {
my $qfn = "$dir_qfn/$fn";
stat($qfn)
or do {
warn("Skipping \"$qfn\": Can't stat: $!\n");
next;
};
-f _
or next;
# ... do something with $fn/$qfn ...
}
}
(Обратите внимание, что при использовании quotemeta
(например, через \Q..\E
как показано выше) не является правильным способом создания шаблона glob из имени каталога в Windows.)