当正则表达式保存在变量中时,谁能解释正则表达式文本替换?我正在尝试处理一些文本,实际上是 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
IE。一行输入变成了两个输出,并且版本字符串已被重用。
代码看起来像这样。首先是正则表达式和替换:
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" }
);
在第二个正则表达式中,变量 $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";
}
}
}
我错过了什么?提前致谢。