3

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

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

wanted()函数对每个 文件和目录执行您想要的任何验证。请注意,尽管它的名称,该wanted() 函数是一个通用的回调函数,并且不告诉文件 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;
4

2 回答 2

7

在 CPAN 上,我发现了几个 File::Find 的替代接口,旨在简化接口。

我会首先尝试File::Finder由著名的 Perl 专家 Randal Schwartz 编写。

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

(可以肯定地说,如果人们正在编写模块来做到这一点,那么没有简单的内置方法可以做到这一点。)

于 2012-09-27T11:43:12.107 回答
2

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

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

通过这种方式,您可以获得您正在寻找的东西,但这与您所做的几乎相同。

于 2012-09-27T12:58:53.707 回答