Как я могу определить, будет ли набор символов в коде Perl действовать как группировка слов или формировать список? - PullRequest
7 голосов
/ 22 мая 2010

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

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

Ответы [ 2 ]

16 голосов
/ 22 мая 2010

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

Контекст имеет значение. Оценка вашего примера (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.
    
8 голосов
/ 22 мая 2010
  1. Context.
  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 .

...