File :: Find是否有更简洁的方式返回所需文件列表?

时间:2012-09-27 11:33:27

标签: perl file-find

我发现File::Find::find背后的设计选择有点令人惊讶。我遇到的所有示例都显示在void上下文中使用find

documentation还澄清了\&wanted中的find( \&wanted, @dirs ) coderef不是一个过滤器(强调我自己):

  

wanted()功能可以对 每个 进行任何验证   文件和目录。请注意,尽管名称为wanted()   function是一个通用的回调函数,并且 告诉   如果文件是“想要的”,则File::Find。实际上,它的回报价值   被忽略了。


但是,如果我想以类似于grep的方式将其用作过滤器,该怎么办?我很想知道是否还有其他方法来编写以下内容:

use strict;
use warnings;
use feature 'say';

use File::Find;

my $wanted = qr/^\d{2}_/;  # e.g.

my @wanted;
find( sub { -f && /$wanted/ && push @wanted, $_ }, '.' );

# I wish my @wanted = find( ... ); worked

say for @wanted;

2 个答案:

答案 0 :(得分:7)

在CPAN上,我找到了几个可用于File :: Find的替代接口,旨在简化接口。

我会先由着名的Perl专家Randal Schwartz尝试File::Finder

File::Find::Rule是另一个。

(可以肯定地说,如果人们正在编写模块来执行此操作,则没有简单的内置方法可以执行此操作。)

答案 1 :(得分:2)

我认为你以正确的方式使用它。您可以做的唯一事情是将find函数包装在另一个创建数组的函数中(使用push),然后将其返回。

sub find_to_array {
    my $wanted = shift;
    my @array;
    find( sub { -f && /$wanted/ && push @array, $_ }, '.' );
    return @array;
}

通过这种方式,您可以拥有自己想要的东西,但它与您所做的几乎相同。