Руководство пользователя для GNU Awk
4. Регулярные выражения
4.7 Использование динамических регулярных выражений
Правая сторона в операторах `~' или`!~' не обязана быть константой regexp (т.е. цепочкой символов между слешами). Это может быть любое выражение. Выражение вычисляется и превращается, если нужно, в цепочку; содержимое цепочек используется как regexp. Каждое regexp, которое вычисляется таким образом, называется динамическим regexp.
Например:
BEGIN - identifier.regexp = "[A-Za-z.][A-Za-z.0-9]+"
"" $0 ~ identifier.regexp - print ""
присваивает идентификатору identifier.regexp значение regexp, которое описывает имена переменных awk и проверяет, соответствует ли входная запись этому regexp.
Внимание: при употреблении операторов `~' и `!~' нужно различать константы regexp, заключенные в слеши, и константы-цепочки в двойных кавычках.
Если вы используете константы-цепочки, вы должны отдавать себе отчет в том, что цепочки сканируются дважды; первый раз, когда awk читает программу, и второй раз, когда awk ищет соответствие между цепочкой в левой части оператора to match the string on the с образцом справа. Так происходит с каждым выражением, имеющем значением цепочку (таким как identifier.reggexp в примере), не являющимся просто цепочкой-константой.
Но какую разницу дает двойное сканирование цепочки? Ответ связан с управляющими последовательностями и особенно с обратными слешами. Чтобы иметь обратный слеш в регулярном выражении внутри некоторой цепочки, нужно напечатать два обратных слеша.
Например, /"*/ есть константа regexp для литерала `*'.
Нужен только один обратный слеш. Чтобы сделать то же самое с цепочкой, нужно напечатать """*". Первый обратный слеш управляет вторым, так что цепочка фактически содержит два символа `"' и `*'. Зная, что вы можете использовать и regexp и строковую константы для описания регулярного выражения, чем вы должны воспользоваться? Ответ будет: "постоянная regexp" в силу трех причин.
1. Константу -цепочку (или строковую константу) труднее писать и труднее читать. Использование константы regexp делает вашу программу более надежной. Непонимание разницы между двумя видами констант есть частый источник ошибок.
2. Употребление констант regexp делает программу эффективнее: awk может заметить, что вы употребили regexp и запомнить его в форме, более удобной для сравнения с образцом. Используя строковую константу, awk должен сначала перевести цепочку в внутреннюю форму, а затем произвести сравнение с образцом.
3. Употребление констант regexp --- предпочтительный стиль; он показывает ясно, что вы устанавливать соответствие с regexp.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|