В жемчуге круглые скобки используются для переопределяющего приоритета (как на большинстве языков программирования), а также для создания списков. Как я могу сказать, будут ли конкретную пару parens рассматривать как группирующуюся конструкцию или список с одним элементом?
Например, я вполне уверен, это - скаляр и не список с одним элементом: (1 + 1)
Но что относительно более сложных выражений? Существует ли простой способ сказать?
Здесь полезны три ключевых принципа:
Контекст - главное. Оценка вашего примера (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 круглые скобки необходимы по причинам приоритета, а не по причинам создания списков. Несколько примеров:
Скобки не действуют: мы вычисляем массив в скаляре. context, поэтому правая сторона возвращает размер массива.
$ x = (@arr);
Скобки не нужны для создания списка с одним элементом.
@arr = 33; # Работает нормально, @arr равно (33).
Но круглые скобки необходимы для нескольких элементов - по соображениям приоритета.
@arr = 12, 34, 56; # @arr равно (12). И мы получаем предупреждения об использовании
# 34 и 56 в пустом контексте.
Примеры:
$x = 1 + 1; # $x is 2.
$x = (1 + 1); # $x is 2.
@x = 1 + 1; # @x is (2).
@x = (1 + 1); # @x is (2).
$x = (1 + 1, 1 + 2); # $x is 3.
@x = (1 + 1, 1 + 2); # @x is (2, 3).
Грубо говоря, в контексте списка оператор запятой разделяет элементы списка; в скалярном контексте оператор запятой - это «последовательная запятая» C, которая оценивает его левую и правую части и возвращает значение правой стороны. В скалярном контексте круглые скобки группируют выражения для переопределения порядка операций, а в контексте списка круглые скобки делают ... на самом деле то же самое. Причина, по которой они уместны при назначении массивов, заключается в следующем:
# Comma has precedence below assignment.
# @a is assigned (1), 2 and 3 are discarded.
@a = 1, 2, 3;
# @a is (1, 2, 3).
@a = (1, 2, 3);
Что касается вашего вопроса «скаляр это или одноэлементный список», это просто не имеет смысла задавать изолированное выражение из-за контекста. . В контексте списка все является списком; в скалярном контексте ничего нет.
Рекомендуемая литература: perlop , perldata , Программирование на Perl .