Скаляр против Оператора Назначения Списка - PullRequest
0 голосов
/ 07 февраля 2019

Пожалуйста, помогите мне понять следующие фрагменты:

  • my $count = @array;
  • my @copy = @array;
  • my ($first) = @array;
  • (my $copy = $str) =~ s/\\/\\\\/g;
  • my ($x) = f() or die;
  • my $count = () = f();
  • print($x = $y);
  • print(@x = @y);

1 Ответ

0 голосов
/ 07 февраля 2019

Символ = компилируется в один из двух операторов присваивания:

  • A оператор присваивания списка (aassign) используется, если левая часть (LHS) из = является некоторой совокупностью.
  • A оператор скалярного присваивания (sassign) используется в противном случае.

Ниже приведенысчитаются агрегатами:

  • Любое выражение в скобках (например, (...))
  • Массив (например, @array)
  • Срез массива (например, @array[...])
  • Хеш (например, %hash)
  • Хеш-фрагмент (например, @hash{...})
  • Любому из вышеперечисленных предшествует my, our или local

Между операторами существуют два различия.

Контекст операндов

Два оператора отличаются в контексте, в котором оцениваются их операнды.

  • Скалярное назначение оценивает оба его операнда в скалярном контексте.

    # @array evaluated in scalar context.
    my $count = @array;
    
  • Назначение списка оценивает оба его операндав контексте списка.

    # @array evaluated in list context.
    my @copy = @array;
    

    # @array evaluated in list context.
    my ($first) = @array;
    

Возвращаемые значения

Два оператора отличаются в том, что они возвращают.

  • Скалярное назначение ...

    • ... в скалярном контексте оценивается как его LHS как lvalue.

      # The s/// operates on $copy.
      (my $copy = $str) =~ s/\\/\\\\/g;
      
    • ... в контексте списка оценивается как его LHS как lvalue.

      # Prints $x.
      print($x = $y);
      
  • Назначение списка ...

    • ... в скалярном контексте определяется числом скаляров, возвращаемых его RHS.

      # Only dies if f() returns an empty list.
      # This does not die if f() returns a
      # false scalar like zero or undef.
      my ($x) = f() or die;
      

      # $counts gets the number of scalars returns by f().
      my $count = () = f();
      
    • ... в контексте списка оценивает скаляры, возвращаемые его LHS, как lvalues.

      # Prints @x.
      print(@x = @y);
      
...