Глава 2: Скалярные данные.
2.2 Скалярные операции
2.2.3 Приоритет и ассоциативность операций
Разным операциям присваивается разный приоритет Это позволяет избежать неоднозначности такого рода, когда две операции пытаются манипулировать тремя операндами. Например, что выполнять в первую очередь в выражении 2+3*4 — сложение или умножение? Если сначала выполнить сложение, мы получим 5*4, или 20. Если же сначала выполнить умножение (как нас учили на уроках математики), то мы получим 2+12, или 14. К счастью, в Perl выбран стандартный математический вариант, т.е. умножение выполняется первым. Поэтому мы говорим, что умножение имеет более высокий приоритет, чем сложение.
Порядок выполнения операций, определяемый приоритетом, можно изменить с помощью круглых скобок. Выражение, заключенное в скобки, вычисляется в первую очередь, и лишь затем выполняется операция, стоящая за скобками (так, как нас учили на уроках математики). Следовательно, если бы нам захотелось выполнить сложение до умножения, необходимо было бы записать (2+3) *4, что дало бы в результате 20. Если вы хотите напомнить, что умножение выполняется перед сложением, можете добавить "декоративные", функционально бесполезные круглые скобки: 2+ (3*4).
При выполнении операций сложения и умножения* очередность их выполнения определяется достаточно просто, но, скажем, при конкатенации строк в сочетании с возведением в степень могут возникнуть проблемы. Единственно верный путь разрешить их — обратиться к официальной, не предполагающей никаких исключений, таблице приоритетов Perl-операций. (Это табл. 2.3. Отметим, что некоторые из операций нами еще не описаны; более того, они могут так и не появиться на страницах этой книги. Пусть, однако, этот факт не отпугнет вас.) Операции, аналогичные операциям С, имеют тот же приоритет, что и в этом языке.
Таблица 2.3. Ассоциативность и приоритет операций: от высокого к низкому
* / % х (умножение, деление, деление с остатком, повторение строки)
Слева
+ - . (сложение, вычитание, конкатенация строк)
Неассоциативные
Именованные унарные операции (например, chomp)
Слева
& (побитовое И)
Слева
| А(побитовое ИЛИ, побитовое исключающее ИЛИ)
Слева
&& (логическое И)
Слева
|| (логическое ИЛИ)
Неассоциативные
. . ... (не включающие или включающие граничные значения диапазоны)
Справа
?: (операция выбора, if-then-else)
Справа
= += -= *= и т.д. (присваивание и присваивание с вычислением)
Слева
, ,> (запятая и запятая-стрелка)
Неассоциативные
Операции над списками (слева направо)
Справа
not (логическое НЕ)
Слева
and (логическое И)
Слева
or xor (логическое ИЛИ, логическое исключающее ИЛИ)
* Вы хорошо помните алгебру? Если нет, то в повсеместном использовании круглых скобок ничего предосудительного нет.
В этой таблице каждая операция имеет более высокий приоритет, чем перечисленные за ней, и более низкий приоритет, чем перечисленные перед ней.
Операции одного уровня приоритетов разрешаются в соответствии с правилами ассоциативности. Как и приоритет, ассоциативность определяет порядок выполнения операций, если две операции с одинаковым приоритетом пытаются манипулировать тремя операндами:
2 ** 3 ** 4 # 2 ** (3 ** 4) , или 2 ** 81, или около 2.41е24
72/12/3 # (72 / 12) / 3, или 6/3, или 2
30 / 6 * 3 # (30/6) *3, или 15
В первом случае операция ** имеет ассоциативность справа, поэтому круглые скобки подразумеваются справа. Операции * и / имеют ассоциативность слева, поэтому круглые скобки подразумеваются слева.