Приоритетность

Объяснения примера в данной главе содержат важный момент, который не полностью очевиден. В следующей строке:

        my @scores = 'Ana' => 8, 'Dave' => 6, 'Charlie' => 4, 'Beth' => 4;

.. в правой части присваивания определен список ( согласно оператору ,), состоящий из пар ( благодаря => ), а затем присваивается переменной-массиву. Глядя на данное выражение вполне можно придумать другие способы интерпретации. Например Perl 5 интерпретирует как :

  (my @scores = 'Ana') => 8, 'Dave' => 6, 'Charlie' => 4, 'Beth' => 4;

... так что в @scores будет содержаться только один элемент. А остальная часть выражения воспринимается как список констант и будет отброшена.

Правила приоритетности определяют способ обработки строки парсером. Правила приоритета в Perl 6 гласят, что инфиксный оператор => имеет более сильную связь с аргументами чем инфиксный оператор ,, который в свою очередь имеет больший приоритет чем оператор присваивания =.

На самом деле существует два оператора присваивания с разными приоритетом. Когда в правой части указан скаляр, используется оператор присваивания еденичного значения с высоким приоритетом. Иначе используется списочный оператор присваивания, который имеет меньший приоритет. Это позволяет следующим выражениям $a = 1, $b = 2 и @a = 1, 2 означать ожидаемое от них: присвоение значений двум переменным в списке и присвоение списка из двух значений одной переменной.

Правила приоритетов в Perl 6 позволяют сформулировать много обычных операций в естественном виде, не заботясь о их приоритетности. Однако если требуется изменить приоритет обработки, то достаточно взять в скобки выражение и данная группа получить наиболее высокий приоритет:

        say 5 - 7 / 2;          # 5 - 3.5  = 1.5
        say (5 - 7) / 2;        # (-2) / 2 =  -1

В приведенной ниже таблице приоритет убывает сверху вниз.

Таблица 3.1. Таблица приоритетов

ПримерИмя
(), 42.5term
42.randвызовы методов и postcircumfixes
$x++автоинкремент и автодекремент
$x**2возведение в степень
?$x, !$xлогический префикс
+$x, ~$xпрефиксные операторы контекстов
2*3, 7/5мультипликативные инфиксные операторы
1+2, 7-5инфиксные операторы сложения
$x x 3оператор репликации (повторитель)
$x ~ ".\n"строковая конкатенация
1&2коньктивный AND (оператор объединения)
1|2коньктивный OR (оператор объединения)
abs $xименованный унарный префикс
$x cmp 3non-chaining binary operators
$x == 3chaining binary operators
$x && $yбинарный логический инфикс AND
$x || $yбинарный логический инфикс OR
$x > 0 ?? 1 !! -1оператор условия
$x = 1присванивание
not $xунарный префикс отрицания
1, 2запятая
1, 2 Z @aинфиксный список
@a = 1, 2префиксный список, присваивание списка
$x and say "Yes"инфикс AND с низким приоритетом
$x or die "No"инфикс OR с низким приритетом
;завершние выражения