Perl5 = (равно) приоритет оператора

#perl #equals #operator-precedence

#perl #равно #оператор-приоритет

Вопрос:

  $a,$b,$c = 1,2,3;
 print "$a, $b, $cn";
  

ВОЗВРАТ

  , , 1
  

Итак, имеет ли = (равно) более высокий приоритет, чем конструкция кортежа — делает это?

  $a,$b,($c=1),2,3;
  

Ответ №1:

ДА. В perlop есть таблица приоритетов. Операторы присваивания имеют уровень 19, а запятая — уровень 20. В общем случае операторы Perl имеют тот же приоритет, что и соответствующие операторы C (для тех операторов, у которых есть соответствующий оператор C).

Если вы имели в виду, ($a,$b,$c) = (1,2,3); вы должны использовать скобки.

Ответ №2:

Оператор запятой, который вы использовали (в скалярном контексте), предназначен не для построения кортежей, а для вычисления нескольких выражений и возврата последнего.

Perl делает что-то по-разному в зависимости от контекста, он решает, что делать, в зависимости от того, ожидает ли он скалярное значение, список, вообще ничего, … Смотрите perldoc perldata раздел о контексте для введения.

Итак, если вы сделаете:

 perl -e '$a = (1 and 4,2,0); print"$an"'
  

Вы получаете 0 , потому что 4,2,0 вычисляется в скалярном контексте и ведет себя как оператор запятой C, вычисляя выражения между запятыми и возвращая результат последнего.

Если вы принудительно 4,2,0 вычисляете в контексте списка:

 perl -e '$a = (1 and @a=(4,2,0)); print"$an"'
  

Вы получаете 3 , потому что присвоение массиву вызывает контекст списка (дополнительные круглые скобки используются для решения проблемы приоритета, упомянутой cjm), а значение списка в скалярном контексте (принудительное из-за того, что является RHS and в скалярном контексте) — это количество элементов, которые в нем есть (логическое and в Perl возвращает последнее вычисленное выражение, а не логическое значение, как в других языках программирования).

Итак, как сказал cjm, вам нужно сделать:

 ($a,$b,$c) = (1,2,3);
  

чтобы разобраться с приоритетом и контекстом принудительного списка.

Обратите внимание на разницу между:

 $ perl -e '$a,$b,$c = (7,6,8); print "$a $b $cn"'
8
  

Оператор запятой вычисляется в скалярном контексте и возвращает 8.

 $ perl -e '($a,$b,$c) = (7,6,8); print "$a $b $cn"'
7 6 8
  

Оператор запятой вычисляется в контексте списка и возвращает список.

 $ perl -e '$a,$b,$c = () = (7,6,8); print "$a $b $cn"'
3
  

Оператор запятой вычисляется в контексте списка, возвращая список, затем присваивание $c вызывает скалярный контекст, возвращая количество элементов в списке.