Руководство пользователя для GNU Awk
7. Выражения
7.2 Использование констант регулярных выражений
Когда такая константа стоит в правой части оператора `~' или `!~' , то она означает только regexp для соответствия.
Константы regexp (такие как /foo/) могут использоваться подобно простым выражениям. Когда константа regexp встречается сама по себе, она имеет то же самое значение как если бы появилась в образце, т.е. `($0 ~ /foo/)' (d.c.) (см. раздел 8.1.3 [Выражения как образцы], стр. 98). Это значит, что два следующих отрезка кодов:
if ($0 ~ /barfly/ ---- $0 ~ /camelot/)
print "found"
и
if (/barfly/ ---- /camelot/)
print "found"
в точности эквивалентны.
Одно довольно странное следствие этого правила состоит в том, что следующее булевское выражение имеет значение 'да', но делает не то, что, вероятно, думает пользователь:
# note that /foo/ is on the left of the ~ if (/foo/ ~ $1)
print "found foo"
Этот код, "очевидно", проверяет $1 на соответствие regexp /foo/. Но выражение `/foo/ ~ $1' фактически означает `($0 ~ /foo/) ~ $1'. Другими словами, сначала проверяется соответствие входной записи и regexp /foo/. Результат будет ноль или один в зависимости от успеха или неудачи соответствия. Затем этот результат сопоставляется первому полю записи. Поскольку мало вероятно, что кто-то на самом деле хочет выполнить такой тест, gawk выдает предостережение, если видит в программе такую конструкцию.
Другое следствие этого правила состоит в том, что оператор присваивания matches = /foo/ присвоит значение ноль или единица переменной matches, в зависимости от содержания текущей входной записи. Это свойство языка никогда не было хорошо документировано до спецификаций POSIX.
Постоянные регулярные выражения также используются в качестве первого аргумента функций gensub, sub и gsub, и как второй аргумент функций соответствия (см. раздел 12.3 [Встроенные функции для действий с цепочками], стр. 137). Современные реализации awk, включая gawk, допускают в качестве третьего аргумента split константу regexp, в то время как некоторые прежние реализации не допускают (d.c.). Это может привести к недоразумению, при попытках использовать константы regexp в качестве аргумента функций, определенных пользователем (см. главу 13 [Функции пользователя, стр. 153).
Например:
function mysub(pat, repl, str, global) -
if (global)
gsub(pat, repl, str) else
sub(pat, repl, str) return str ""
-
... text = "hi! hi yourself!"
mysub(/hi/, "howdy", text, 1) ... ""
В этом примере программист хочет передать константу regexp в пользовательскую функцию mysub, которая в свою очередь передаст ее или в sub или в gsub. Однако, на самом деле произойдет следующее: параметр pat будет единицей или нулем в зависимости от того, соответствуют или нет $0 и /hi/. Поскольку маловероятно, что вы на самом деле хотите передать таким путем булевское значение, gawk выдает предостережение, когда видит константу regexp в позиции аргумента в определенной пользователем функции.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|