我发现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;
答案 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;
}
通过这种方式,您可以拥有自己想要的东西,但它与您所做的几乎相同。