Может ли кто-нибудь объяснить замену текста регулярным выражением, когда регулярное выражение содержится в переменной? Я пытаюсь обработать некоторый текст, на самом деле спецификации конфигурации 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
т.е. Один строковый ввод превратился в два вывода, и строка версии была повторно использована.
Код выглядит примерно так. Сначала регулярные выражения и замены:
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";
}
}
}
Что мне не хватает? Заранее спасибо.
qr//
строкой напрямую. Не используйте\\1
в правой части замен! И, пожалуйста, избавьтесь от этих уродливых LTS-строк. - person tchrist   schedule 03.11.2010\Q
вperldoc perlreref
. - person Sinan Ünür   schedule 03.11.2010