0

私はFile::Findディレクトリを検索するために使用しています。@ARGV次に、ユーザーが入力した用語を一致させるために使用したいと思います。最後から 2 番目の要素のみをマッチングに使用したい (最後は出力名)。私のコードは機能するはずですが、そうではありません。何かアイデアはありますか?

if ($File::Find::name =~ m/$_/ for @ARGV[0..-2]){
    #manipulate filenames
}

ありがとう。

4

2 に答える 2

3

なぜ$File::Find::nameここを使うのですか?これは相対パスであり、ファイル名だけではありません。ここでファイル名を一致させようとしていると思います。行うことは次のとおりです。

my $output = pop @ARGV;             # now you can use @ARGV freely
my $regex  = join "|",              # join by alternations
                 map quotemeta,     # disable meta characters
                 @ARGV;             # list of file names
find(sub { 
        /$regex/i or return;        # quick check
        # manipulate files...
     }, $dir);

大文字と小文字を区別しないかどうかを使用して、メタ文字を無効にするかどうかなど、できる微調整があります/.../i

ドキュメンテーション: popjoinquotemeta

于 2013-06-11T11:10:17.197 に答える
1

EXPR for LISTステートメントであり、式ではありません。if (COND) {BLOCK}式になることを期待CONDしています。

を介してブロックを式に埋め込むことができますがdo {BLOCK}、これでは希望どおりの結果が得られません。

「リストのいずれかの項目が一致する場合、ファイル名を操作する」を表現したい場合は、次のようにします。

if (grep { $File::Find::name =~ /$_/ } LIST) { ... }

「リストのすべての項目が一致した場合にファイル名を操作する」を表現したい場合は、

if (not grep { not $File::Find::name =~ /$_/ } LIST) { ... }

@array[0..-2]範囲演算子は配列添字では特別ではないため、配列をスライスすることはできません。0 から -2 までの範囲は空です。むしろ: @array[0 .. @array-2].

于 2013-06-11T10:47:51.577 に答える