正規表現が変数に保持されている場合、正規表現のテキスト置換について説明できる人はいますか? いくつかのテキスト、Clearcase 構成仕様を実際に処理し、テキストを置き換えようとしています。置換のルールは、一致する正規表現と置換するテキストを持つハッシュの配列に保持されます。
入力テキストは次のようになります。
element /my_elem/releases/... VERSION_STRING.020 -nocheckout
ほとんどの置換は、特定のテキスト文字列を含む行を削除するだけであり、これはうまく機能します。場合によっては、テキストを置き換えたいのですが、VERSION_STRING テキストを再利用します。置換式で $1 を使用しようとしましたが、うまくいきません。$1 はマッチでバージョン文字列を取得しますが、$1 の置換は置換で機能しません。
これらの場合、出力は次のようになります。
element -directory /my_elem/releases/... VERSION_STRING.020 -nocheckout
element /my_elem/releases/.../*.[ch] VERSION_STRING.020 -nocheckout
すなわち。1 行の入力が 2 つの出力になり、バージョン文字列が再利用されました。
コードは次のようになります。最初に正規表現と置換:
my @Special_Regex = (
{ regex => "\\s*element\\s*\/my_elem_removed\\s*\/main\/\\d+\$", subs => "# Line removed" },
{ regex => "\\s*element\\s*\/my_elem_changed\/releases\/\.\.\.\\s*\(\.\*\$\)",
subs => "element \-directory \/my_elem\/releases\/\.\.\. \\1\nelement \/my_elem\/releases\/\.\.\.\/\*\.\[ch\] \\1" }
);
2 番目の正規表現では、変数 $1 が部分 (.*\$) で定義されており、これは正しく機能しています。ただし、subs 式はそれを置き換えません。
foreach my $line (<INFILE>)
{
chomp($line);
my $test = $line;
foreach my $hash (@Special_Regex)
{
my $regex = qr/$hash->{regex}/is;
if($test =~ s/$regex/$hash->{subs}/)
{
print "$test\n";
print "$line\n";
print "$1\n";
}
}
}
私は何が欠けていますか?前もって感謝します。