... | 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]/"