Как я могу сказать, будет ли ряд parens в коде Perl действовать как группирующийся parens или формировать список?

В жемчуге круглые скобки используются для переопределяющего приоритета (как на большинстве языков программирования), а также для создания списков. Как я могу сказать, будут ли конкретную пару parens рассматривать как группирующуюся конструкцию или список с одним элементом?

Например, я вполне уверен, это - скаляр и не список с одним элементом: (1 + 1)
Но что относительно более сложных выражений? Существует ли простой способ сказать?

7
задан Brian Tompsett - 汤莱恩 6 June 2015 в 14:59
поделиться

2 ответа

Здесь полезны три ключевых принципа:

Контекст - главное. Оценка вашего примера (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 в пустом контексте.
    
17
ответ дан 6 December 2019 в 07:05
поделиться
  1. Контекст.
  2. Скобки не играют той роли, которую, по вашему мнению, они играют в создании списка.

Примеры:

$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 .

8
ответ дан 6 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: