Руководство пользователя для GNU Awk
7. Выражения
7.11 Булевские выражения
Булевское выражение есть комбинация выражений сравнения или выражений соответствия с употреблением булевских операторов "или" (`----'), "и" (`&&') и "not" (`!') со скобками для управления порядком действий. Значение истинности булевского выражения вычисляется через значения истинности его компонент. Булевские выражения называются также логическими выражениями. Эти термины эквивалентны.
Булевские выражения могут употребляться всюду, где используются выражения сравнения и соответствия. Они могут использоваться в операторах if, while, do и for (см. главу 9 [Управляющие операторы в действиях], стр. 105). Они имеют численные значения (один если true, ноль если false), которые входят в игру, если значение булевского выражения присваивается переменной или используется в арифметике. Кроме того, каждое булевское выражение есть правильный образец , так что можно использовать единицу как образец при выполнении правил.
Приведем описания трех булевских операторов с примерами.
boolean1 && boolean2
True если boolean1 и boolean2 есть true.
Например, следующий оператор
печатает текущую входную запись,
если она содержит `2400' и `foo'.
if ($0 ~ /2400/ && $0 ~ /foo/) print
Подвыражение boolean2 вычисляется только если boolean1 есть true. Это может привести к различиям, если boolean2 содержит выражения с побочным эффектом: `$0 ~ /foo/ && ($2 == bar++)'.
Переменная bar не увеличивается, если нет `foo' в записи.
boolean1 ---- boolean2
True если по крайней мере одна из boolean1 или boolean2 есть true. Например, следующий оператор печатает все записи из ввода, которые содержат или `2400' или `foo', или и то и другое.
if ($0 ~ /2400/ ---- $0 ~ /foo/) print
Подвыражение boolean2 вычисляется только если boolean1 есть false. Это может привести к различиям, когда boolean2 содержит выражения с побочными эффектами.
! boolean True если boolean есть false.
Например, следующая программа печатает
все записи входного файла `BBS-list' которые не содержат
цепочки `foo':
awk '- if (! ($0 ~ /foo/)) print ""' BBS-list
Операторы `&&' и `----' называются операторами короткой схемы выполнения (short-circuit operators) из-за вида их работы. Вычисление полного выражения прерывается, если результат может быть определен на полпути их вычисления.
Можно продолжить оператор, который использует `&&' or `----', просто поместив newline после него. Но нельзя помещать newline перед любым из этих операторов, не используя продолжения обратным слешем (см. раздел 2.6 [awk-операторы против строк], стр. 17).
Фактически значение выражения, содержащего оператор `!', будет или единица или ноль, в зависимости от значения, к которому он применен. Оператор `!' часто полезен для изменения смысла переменной-флажка с false на true, и наоборот. Например, следующая программа дает один способ печатать строки между специальными ограничивающими строками:
$1 == "START" - interested = ! interested "" interested == 1 -&
print "" $1 == "END" - interested = ! interested ""
Переменная interested, подобно всем переменным в awk, в начале инициализируется нулем, который также есть false. Когда появляется строка с первым полем `START', значение ее перекидывается в true, используя `!'. Следующее правило печатает строки, пока interested есть true. Когда появляется строка с первым полем `END', interested переключается опять на false.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|