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

Perl File::Find是否有更简洁的方法返回所需文件的列表?,perl,file-find,Perl,File Find,我觉得背后的设计选择有点令人惊讶。我遇到的例子都显示了在void上下文中使用的find 还澄清了find(\&wanted,@dirs)中的\&wantedcoderef并不意味着是一个过滤器(强调我自己): wanted() 文件和目录。请注意,尽管名称不同,wanted() 函数是一个通用回调函数,它不告诉 文件::查找文件是否“需要”。事实上,它的返回值 被忽略了 但是,如果我真的想用它作为过滤器的方式类似于?我很想知道是否还有其他方法可以写以下内容: use strict; use w

我觉得背后的设计选择有点令人惊讶。我遇到的例子都显示了在void上下文中使用的
find

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

wanted()
文件和目录。请注意,尽管名称不同,
wanted()
函数是一个通用回调函数,它不告诉
文件::查找文件是否“需要”。事实上,它的返回值
被忽略了


但是,如果我真的想用它作为过滤器的方式类似于?我很想知道是否还有其他方法可以写以下内容:

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;

在CPAN上,我发现了几个可供选择的File::find接口,旨在简化接口

我会首先尝试一下,由著名的Perl专家Randal Schwartz担任

这是另一个


(可以肯定地说,如果人们编写模块来实现这一点,没有简单的内置方法。)

我认为您使用它的方式是正确的。您只能将
find
函数包装到另一个创建数组的函数中(使用
push
),然后返回它

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

通过这种方式,你可以得到你想要的,但它几乎和你所做的一样。

在任何人建议使用
glob
readdir
之前,我之所以要使用
File::Find::Find
是因为它能够递归到目录中。我认为你当前的代码非常好。你为什么需要另一种选择?我可能会重新表述您\&want coderef,但没有什么不同。@pmakholm:我知道代码没有问题。。。但是在
\&want
中累积结果似乎很麻烦,我想知道是否有一个函数或替代语法允许我生成筛选列表。Hmmm。。。我认为我不必在
File::Find
之外寻找这种功能。不过,我喜欢您建议的替代方案,尤其是
File::Find::Rule
File::Finder
具有
File::Find::Rule
的所有功能(您甚至可以将FFR插件与之配合使用!)等等。我写了
File::Finder
,因为我记不起FFR的命名约定。。。我的代码如下
精确地查找(1)