标量与列表赋值运算符

Scalar vs List Assignment Operator

请帮助我理解以下片段:

符号=被编译为两个赋值运算符之一:

  • 如果 = 的左侧 (LHS) 是某种聚合,则使用 列表赋值运算符 (aassign)。
  • A 标量赋值运算符 (sassign) 否则使用。

以下被认为是聚合:

  • 括号中的任何表达式(例如 (...)
  • 数组(例如@array
  • 数组切片(例如@array[...]
  • 一个散列(例如%hash
  • 一个哈希切片(例如@hash{...}
  • 以上任何一个前面有 myourlocal

运算符之间有两个区别。

操作数的上下文

这两个运算符在计算其操作数的上下文中有所不同。

  • 标量赋值在标量上下文中评估其两个操作数。

    # @array evaluated in scalar context.
    my $count = @array;
    
  • 列表赋值在列表上下文中评估其两个操作数。

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

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

返回值

这两个运算符的不同之处在于 return。

  • 标量赋值...

    • ... 在标量上下文中将其 LHS 计算为左值。

      # The s/// operates on $copy.
      (my $copy = $str) =~ s/\/\\/g;
      
    • ...在列表上下文中将其 LHS 计算为左值。

      # Prints $x.
      print($x = $y);
      
  • 列表赋值...

    • ... 在标量上下文中计算由其 RHS 编辑的标量数 return。

      # 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();
      
    • ... 在列表上下文中计算标量 return 由其 LHS 作为左值。

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