Здесь полезны три ключевых принципа:
Контекст - главное. Оценка вашего примера (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.
person
FMc
schedule
22.05.2010
$x = @{[ 1 + 1 ]};
. Кажется, что присвоение списка скаляру отличается от присвоения массива скаляру. Что произойдет, если вы назначите скаляр список, содержащий массив?$x = (@list);
- person Ryan C. Thompson   schedule 23.05.2010