ファイル名にダッシュが含まれている場合、Perlに問題があります。

ファイル名にダッシュが含まれている場合、Perlに問題があります。
... | perl -pe "s/([^$filespec]*)($filespec)/ ...

$filespecしたがって、ほとんどの場合、上記の構造がうまく機能する機能があります。しかし、ファイル名にダッシュがある場合メッセージを受け取りましたInvalid [] range

$filespecこれらの解析エラーの影響を受けないファイル名に変数を拡張するにはどうすればよいですか?

ベストアンサー1

主な仮定 -$filespec一致させたい文字セット。これはいいえ正規表現。

いくつかのコードを使ってこの問題をシミュレートしましょう。

filespec = 'z-a'
perl -e 'print "MATCH\n" if "DEF" =~ /$filespec/'

use strict;
use warnings;

my $filespec = 'z-a';

print "Match\n" if "DEF" =~ m/[^$filespec]/ ;

走ることができる

Invalid [] range "z-a" in regex; marked by <-- HERE in m/[^z-a <-- HERE ]/ at try line 6.

$filespec問題は正規表現の拡張ですm/[^z-a]/。この場合、z-a文字範囲は無効です。

この問題を解決するには、(少なくとも)-inをエスケープする必要があります$filespec。これにより、quotemeta次のようにトリックを実行できます。

use strict;
use warnings;

my $filespec = quotemeta 'z-a';

print "Match\n" if "DEF" =~ m/[^$filespec]/ ;

出力は次のとおりです

Match

これをパイプコマンドシミュレーションに含めます。 1つ目は失敗したコマンドのバージョンです。

filespec='z-a'
perl -e "print qq[MATCH\n] if 'DEF' =~ /[^$filespec]/"

走る

Invalid [] range "z-a" in regex; marked by <-- HERE in m/[^z-a <-- HERE ]/ at -e line 1.

これは固定バージョンです。

filespec='z-a'; 
filespec=`perl -e "print quotemeta qq[$filespec]"`
perl -e "print qq[MATCH\n] if 'DEF' =~ /[^$filespec]/"

おすすめ記事