Хорошо, для начала: операторы списков относятся к числу объектов с наименьшим приоритетом в perl, но только с правой стороны . Вы спрашиваете, что это значит: давайте сделаем это просто. Предположим, что есть листоп, называемый foo
. Неважно, что он делает, но он есть. Вы можете легко создать такую вещь с помощью sub foo { map 10 * $_, @_ }
, который возвращает каждый из своих аргументов, умноженный на десять. Это из пути:
print 1, 2, 3;
эквивалентно print( 1, 2, 3 );
print foo 1, 2, 3;
эквивалентно print( foo( 1, 2, 3 ) );
print 1, foo 2, 3;
эквивалентно print( 1, foo( 2, 3 ) );
Мы можем видеть, что foo
сжимает столько, сколько может с правой стороны - только конец утверждения (пока ...) может остановить его. Если бы мы написали @array = (1, foo 2, 3);
, это было бы эквивалентно @array = (1, foo(2, 3) );
, потому что окончание курса, заключенное в круглые скобки, по-прежнему применяется.
Поскольку запятые также имеют очень низкий приоритет (чуть выше «Операторы списка (вправо)»), мы также можем поместить практически любой вид выражения, который мы хотим, в аргументы списка - это всего лишь способ Perl убедиться, что нам не нужно добавлять скобки большую часть времени. Математические, побитовые операторы, сравнения, даже совпадения с регулярными выражениями имеют более высокий приоритет.
Единственные вещи, которые делают имеют более низкий приоритет, - это прописанные логические связки and
, or
, xor
и not
. Так что если мы напишем
foo 1, 2, 3 and 4;
, что означает (foo(1, 2, 3) and 4)
- аргументы foo
останавливаются слева от and
. Это выглядит глупо в надуманном примере, поэтому давайте превратим его в общую идиому perl:
open $fh, '<', $filename or die "$! opening $filename";
, что эквивалентно
(open($fh, '<', $filename) or die("$! opening $filename"));
, который на самом деле точно эквивалентен (и компилируется в)
die "$! opening $filename" unless open $fh, '<', $filename;
с использованием формы-оператора-модификатора unless
(которая вообще не является оператором, допускается только один раз для каждого оператора и только в конце оператора, поэтому она на самом деле не имеет приоритета при все, но вы могли бы рассматривать это как «более низкий, чем самый низкий» приоритет слева).
Так или иначе, возвращаясь к исходному примеру кода - аргументы print
заканчиваются слева от and
, а справа от and
- это совершенно отдельное выражение запятой - которое вообще ничего не делает потому что это всего лишь несколько констант 3 > 4
и "\n"
, вычисленных в пустом контексте.