私はFile::Find
ディレクトリを検索するために使用しています。@ARGV
次に、ユーザーが入力した用語を一致させるために使用したいと思います。最後から 2 番目の要素のみをマッチングに使用したい (最後は出力名)。私のコードは機能するはずですが、そうではありません。何かアイデアはありますか?
if ($File::Find::name =~ m/$_/ for @ARGV[0..-2]){
#manipulate filenames
}
ありがとう。
私はFile::Find
ディレクトリを検索するために使用しています。@ARGV
次に、ユーザーが入力した用語を一致させるために使用したいと思います。最後から 2 番目の要素のみをマッチングに使用したい (最後は出力名)。私のコードは機能するはずですが、そうではありません。何かアイデアはありますか?
if ($File::Find::name =~ m/$_/ for @ARGV[0..-2]){
#manipulate filenames
}
ありがとう。
なぜ$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
。
は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]
.