我想要匹配的模式是*_name.txt
我想搜索的目录是$ dir($ dir有很多子目录,这就是我需要File::Find
而不是glob
我不会使用Find::Find::Rule
(我知道它有简单的代码,但是当我运行时,它有不存在的文件错误。我不想向我添加其他文件perl library)
到目前为止我的语法是
use File::Find;
find(\&store_foundfiles,$dir);
sub store_foundfiles {
my @string = *_name.txt;
#I DONT KNOW FROM HERE ON"
#I WANT TO IMPLEMENT THE FOLLOWING...
#FOREACH MATCH ON @string, STORE THE MATCH TO ARRAY '@found'
}
答案 0 :(得分:4)
添加此项,因为大多数人员可能应该使用File::Find::Rule,即使您有理由不这样做:
use File::Find::Rule;
my @files = File::Find::Rule->file->name("*_name.txt")->in($dir);
答案 1 :(得分:3)
use strict;
use warnings;
use File::Find;
my @found;
find(
sub {
push @found, $File::Find::name if /_name[.]txt\z/;
# or push @found, $File::Find::name if substr($_, -9) eq '_name.txt';
},
$dir,
);
for my $file (@found) { ... }
数组在子例程之外声明,因此它会在子例程的范围之外。如果你有大量的文件,你可能想要处理每个文件,而不是将它们全部存储在一个数组中并循环遍历(NB:某些操作不能懒得完成,比如排序)。
推送{p>$File::Find::name
而不是$_
,因为绝对路径可能更有用。如果您只想要基本文件名,请推送$_
。