Может ли кто-нибудь объяснить текстовые подстановки регулярного выражения, когда регулярное выражение хранится в переменной? Я пытаюсь обработать некоторый текст, спецификации конфигурации Clearcase на самом деле и заменить текст, когда я иду. Правила подстановки хранятся в массиве хэшей, которые имеют регулярное выражение для соответствия, и текст для замены.Переменные регулярного выражения Perl и подстановочная подстановка шаблона
вводимый текст выглядит Somthing так:
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";
}
}
}
Что мне не хватает? Заранее спасибо.
Не используйте ddooublblle slackbashed строки для регулярных выражений, а затем скомпилируйте их все это время. Просто сделайте хэш-значения 'qr //' string напрямую. Не используйте '\\ 1' на RHS замен! И, пожалуйста, избавитесь от этих уродливых строк LTS. – tchrist
Я уверен, что кто-то захочет прочитать сообщение. В то же время, пожалуйста, сделайте сами и всех, кто должен читать, чтобы закодировать услугу и искать '\ Q' в' perldoc perlreref'. –
Простой комментарий. Этот код прошел несколько ревизий, пока я экспериментировал - я удалил qr, чтобы контролировать то, что было экранировано, а что нет. Вы можете доверять мне, что регулярные выражения работают, за исключением $ 1 \ 1 замен. – 0xDEADBEEF