Я думаю, что поведение первого оператора является результатом Devel::REPL
, но в данный момент у меня нет его для проверки этого предположения.
Скобки в Perl в первую очередь корректируют приоритет.Они также могут регулировать то, как синтаксический анализатор видит некоторые операторы, но здесь это не так.=
имеет более высокий приоритет, чем ,
, поэтому в первом операторе, если Devel::REPL
оценивает операторы в контексте списка, он анализируется как список, где первый элемент является результатом присваивания от 1 до $x
а второе и третье значения равны 2 и 4. Во втором порядке был изменен приоритет, и в результате контекст изменился так, что ,
находится в скалярном контексте, а 4 присвоено $x
.
$ perl -MO=Deparse,-p -e 'my $x = 1,2,4'
((my $x = 1), '???', '???');
-e syntax OK
$ perl -MO=Deparse,-p -e 'my $x = (1,2,4)'
(my $x = ('???', '???', 4));
-e syntax OK
Я бы поспорил, если вы наберете scalar(my $x = 1,2,4)
в Devel::REPL
, результат будет 4, а $x
будет равен 1.