标量与列表分配运算符

时间:2019-02-07 00:00:50

标签: perl assignment-operator

请帮助我理解以下代码段:

  • 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 :(得分:2)

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

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

以下内容被视为汇总:

  • 括号中的任何表达式(例如(...)
  • 一个数组(例如@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;
    

返回的值

两个运算符的返回值不同。

  • 标量分配...

      在标量上下文中,
    • ...将其LHS评估为左值。

      # The s/// operates on $copy.
      (my $copy = $str) =~ s/\\/\\\\/g;
      
    • 列表上下文中的
    • ...以左值评估其LHS。

      # 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返回的标量评估为左值。

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