Здесь пригодятся три ключевых принципа:
Контекст имеет значение. Оценка вашего примера (1 + 1)
зависит от контекста.
$x = (1 + 1); # Scalar context. $x will equal 2. Parentheses do nothing here.
@y = (1 + 1); # List context. @y will contain one element: (2).
# Parens do nothing (see below), aside from following
# syntax conventions.
В скалярном контексте не существует такой вещи, как список .Чтобы увидеть это, попробуйте назначить то, что выглядит как список для скалярной переменной.Чтобы подумать об этом, нужно сосредоточиться на поведении оператора запятой: в скалярном контексте он оценивает свой левый аргумент, отбрасывает это значение, затем оценивает свой правый аргумент и возвращает это значение.В контексте списка оператор запятой вставляет оба аргумента в список.
@arr = (12, 34, 56); # Right side returns a list.
$x = (12, 34, 56); # Right side returns 56. Also, we get warnings
# about 12 and 34 being used in void context.
$x = (@arr, 7); # Right side returns 7. And we get a warning
# about using an array in a void context.
Скобки не создают списки .Оператор запятой создает список (при условии, что мы находимся в контексте списка).При вводе списков в коде Perl круглые скобки необходимы по причинам старшинства, а не по причинам создания списков.Несколько примеров:
Скобки не действуют: мы оцениваем массив в скалярном контексте, поэтому правая часть возвращает размер массива.
$x = (@arr);
Скобки не нужны для создания списка с одним элементом.
@arr = 33; # Works fine, with @arr equal to (33).
Но скобки нужны с несколькими элементами - по соображениям приоритета.
@arr = 12, 34, 56; # @arr equals (12). And we get warnings about using
# 34 and 56 in void context.