П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 174964 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 71896 раз(а).

Учебник HTML.
Просмотров 72036 раз(а).

Руководство по PHP5.
Просмотров 42644 раз(а).

Хостинг через призму DNS.
Просмотров 49115 раз(а).

Подборка текстов стандартных документов.
Просмотров 43058 раз(а).

Учебник PHP - Самоучитель
Просмотров 49402 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 49639 раз(а).

Внешние атаки...
Просмотров 40198 раз(а).

Учебник PHP.
Просмотров 35218 раз(а).

SSI в примерах.
Просмотров 26516 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь




Руководство пользователя для 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 в позиции аргумента в определенной пользователем функции.

Назад | Вперед
Содержание (общее) | Содержание раздела



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru