П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
                                                 
Главная

О проекте

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

MySQL

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

Хостинг

Другое







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

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

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

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

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

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

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

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

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

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

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

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



 
 



Руководство пользователя для 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-2011 Project.Net.Ru


ингалятор