Оператор запятой в том виде, в котором вы его использовали (в скалярном контексте), предназначен не для построения кортежа, а для вычисления нескольких выражений и возврата последнего.
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
вызывает скалярный контекст, возвращая количество элементов в списке.