Руководство пользователя для GNU Awk
9. Управляющие операторы в действиях
9.7 Оператор next
Оператор next понуждает awk немедленно прекратить обработку текущей записи и перейти к следующей записи. Это значит, что последующие правила не применяются к текущей записи. Также не выполняются оставшиеся действия текущего правила.
Не совсем так он действует в случае функции getline (см. раздел 5.8 [Явный ввод по getline], стр. 53). Он тоже побуждает awk прочесть немедленно следующую запись, но никак не меняет ход управления. То есть остаток текущих действий переносится на следующую запись.
На самом верхнем уровне выполнение awk-программы есть цикл, который читает входную запись и проверяет ее на соответствие образцу каждого правила. Если представлять себе этот цикл как оператор for, тело которого содержит правила, то оператор next аналогичен оператору continue: он пропускает конец тела этого неявного цикла и вычисляет increment (т.е, читает следующую запись).
Например, если ваша awk-программа работает только на записях с четырьмя полями и вы не хотите ее прекращения при несоответствующем вводе, вы можете использовать такое правило около начала программы:
NF != 4 -
err = sprintf("%s:%d: skipped: NF != 4"n", FILENAME, FNR) print err ?&
"/dev/stderr" next ""
так что следующие правила не увидят плохую запись. Сообщение об ошибке перенаправляется по стандартному потоку выдачи ошибок, как и следует для сообщений об ошибках. См. раздел 6.7 [Специальные имена файлов в gawk], стр. 72.
Соответственно стандарту POSIX, поведение не определено, если оператор next использован в правиле BEGIN или END. gawk трактует это как синтаксическую ошибку. Хотя POSIX допускает это, некоторые другие реализации не терпят оператор next внутри тел функций (см. главу 13 [Функции, определенные пользователем], стр. 153). Также как и операторы next в других позициях, next внутри тела функции читает следующую запись и начинает ее обработку с первого правила программы. Если оператор next приводит к концу ввода, то выполняется код из любого правила END. См. раздел 8.1.5 [Специальные образцы BEGIN и END], стр. 100.
ВНИМАНИЕ: некоторые реализации awk генерируют динамическую ошибку, если вы используете оператор next внутри пользовательской функции (см. главу 13 [Функции, определенные пользователем], стр. 153). gawk не имеет таких проблем.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|