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

时间:2014-10-09 23:53:02

标签: perl

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

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

  3. 的原因
  4. 我不会使用Find::Find::Rule(我知道它有简单的代码,但是当我运行时,它有不存在的文件错误。我不想向我添加其他文件perl library)

  5. 到目前为止我的语法是

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

2 个答案:

答案 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而不是$_,因为绝对路径可能更有用。如果您只想要基本文件名,请推送$_