Perl: прохождение поиска и замены регулярных выражений с использованием переменных

У меня есть сценарий Perl, который читает поиск регулярных выражений и заменить значения из файла INI.

Это работает нормально, пока я не попытаюсь использовать переменные захвата ($ 1 или \ 1). Они заменяются буквально на $ 1 или \ 1.

Любые идеи, как я могу заставить эту функцию захвата работать, передавая биты регулярных выражений через переменные? Пример кода (без использования INI-файла) ...

$test = "word1 word2 servername summary message";

$search = q((\S+)\s+(summary message));
$replace = q(GENERIC $4);

$test =~ s/$search/$replace/;
print $test;

Это приводит к ...

word1 word2 GENERIC $4

НЕ

word1 word2 GENERIC summary message

Спасибо

 andyml7313 июл. 2012 г., 13:36
извините за ошибку с моей стороны!
 tuxuday13 июл. 2012 г., 13:32
ваш шаблон поиска не удастся, есть!: в конце шаблона поиска, но не в строке.

Ответы на вопрос(5)

$ 4 не имеет особого значения в q (), и движок RE его не распознает.

\ 4 имеет особое значение для двигателя RE.

 13 июл. 2012 г., 14:11
Аркадий, это не поможет, конечно. Вам нужен дополнительный шаг оценки.
 22 июл. 2012 г., 20:53
Ох, креп, я думал, что Perl выполняет интерполяцию переменных, а затем применяет синтаксис RE. Я думаю, что я ошибся, а значения переменных рассматриваются как литералы. Спасибо за указание на это.

я предполагаю, что "GENERIC $ 1" не является конфигурацией (особенно ее часть $ 1). В этом случае я думаю, что есть еще более простое решение без использования прогнозных показателей:

$test = "word1 word2 servername summary message";
$search = qr/\S+\s+(summary message)/;
$replace = 'GENERIC';
$test =~ s/$search/$replace $1/;

Хотя, конечно, в этом нет ничего плохого (? = УЗОР).

Решение Вопроса

$search = q((\S+)\s+(summary message));
$replace = '"GENERIC $1"';

$test =~ s/$search/$replace/ee;

Обратите внимание на двойные кавычки в$replace а такжеee в концеs///.

 andyml7313 июл. 2012 г., 13:50
это делает трюк, ура

Другое интересное решение будет использовать прогнозные(?=PATTERN)

Тогда ваш пример заменит только то, что нужно заменить:

$test = "word1 word2 servername summary message";

# repl. only ↓THIS↓
$search = qr/\S+\s+(?=summary message)/;
$replace = q(GENERIC );

$test =~ s/$search/$replace/;
print $test;
 andyml7313 июл. 2012 г., 14:40
Мне нравится, это может быть более элегантно, спасибо

имейте в виду, что замена идет из внешнего файла

eval "$test =~ s/$search/$replace/";

Ваш ответ на вопрос