#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
вызывает скалярный контекст, возвращая количество элементов в списке.