3

デザインの選択File::Find::findは少し意外なものです。私が出くわした例はすべてfind、voidコンテキストで使用されていることを示しています。

ドキュメントはまた、の\&wantedcoderefがフィルターであることを意図していないことを明確にしてfind( \&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の専門家であるRandalSchwartzによって試してみます。

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 に答える