Perl Regexes - замена определенных совпадений - PullRequest
1 голос
/ 06 декабря 2009

Я пытаюсь заменить текст в исходном файле так же, как препроцессор C работает. Мой подход состоит в том, чтобы разобрать константы и их значения и заполнить хэш-массив их. Моя проблема заключается в следующем:

В исходном файле у меня есть:

#define CONSTANT 10
#define CONSTANT_PLUS_ONE CONSTANT + 1

Я использую /^#define\s+(\w.*)\s+.*($key).*/, чтобы соответствовать второму линии, но когда я заменяю на s/$2/$defines{$key}/, оба экземпляры CONSTANT заменяются, т.е.

#define CONSTANT 10
#define 10_PLUS_ONE 10 + 1

Я новичок в Perl, так что я надеюсь, что кто-то может наведите меня в правильном направлении, или если я сделал явно глупая ошибка.

Ответы [ 3 ]

5 голосов
/ 06 декабря 2009

Попробуйте указать границы слова:

s/\b$2\b/$defines{$key}/g;
3 голосов
/ 06 декабря 2009

\w.* будет соответствовать символу слова, а затем любому числу любого символа, что не является тем, что вы хотите - вам нужно привязать к окончанию слова или, по крайней мере, убедиться, что каждый символ в совпадении является символом слова например, \w+. Итак, попробуйте это:

/^#define\s+(\w+)\s+($key).*/

См. Полную спецификацию специальных символов и типов соответствия в perldoc perlre .

2 голосов
/ 06 декабря 2009

Вы также можете просто запустить свой код через препроцессор C. Передайте это как STDIN, чтобы компилятор не пытался стать умным и слишком много читать в расширение файла.

cc -E - < <file> > <newfile>

И если это исходный код Perl, с которым вы это делаете, у него уже есть константы. И да, вы получаете все преимущества производительности при намотке.

use constant PI => 3.14;
use constant CAKE => PI + 1.2345;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...