File::Find 要搜索目录和子目录,使用模式匹配将成功的匹配存储到数组


  1. 我想要匹配的模式是*_name.txt

  2. 我要搜索的目录是$dir($dir有很多子目录,这就是为什么我需要File::Find而不是glob

  3. 我不打算使用Find::Find::Rule(我知道它有简单的代码,但是当我运行时,它有不存在的文件错误。 我不想在我的perl库中添加其他文件(

到目前为止,我拥有的语法是

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'
}
添加

这个是因为大多数人可能应该使用File::Find::rule,即使你有理由不这样做:

use File::Find::Rule;
my @files = File::Find::Rule->file->name("*_name.txt")->in($dir);
use strict;
use warnings;
use File::Find;
my @found;
find(
    sub {
        push @found, $File::Find::name if /_name[.]txtz/;
        # or push @found, $File::Find::name if substr($_, -9) eq '_name.txt';
    }, 
    $dir,
);
for my $file (@found) { ... }
数组在子例程

之外声明,因此它保留在子例程的范围之外。如果你有大量的文件,你可能希望在遇到每个文件时处理它,而不是将它们全部存储在一个数组中并循环访问它(注意:某些操作不能懒惰地完成,如排序(。

$File::Find::name被推送而不是$_,因为绝对路径可能更有用。如果您只需要基本文件名,请按$_

最新更新