Perl5 = (равно) приоритет оператора - PullRequest
3 голосов
/ 14 мая 2011
 $a,$b,$c = 1,2,3;
 print "$a, $b, $c\n";

возвращает

 , , 1

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

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

Ответы [ 2 ]

8 голосов
/ 14 мая 2011

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

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

2 голосов
/ 14 мая 2011

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

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

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

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

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

Если вы заставляете 4,2,0 быть оцененным в контексте списка:

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

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

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

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

чтобы иметь дело с приоритетом и списком форсированного списка.

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

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

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

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

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

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

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

...