标量与列表赋值运算符

Scalar vs List Assignment Operator

提问人:ikegami 提问时间:2/7/2019 最后编辑:ikegami 更新时间:9/14/2022 访问量:456

问:

请帮助我理解以下片段:

  • 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);
perl 赋值运算符

评论

0赞 ysth 2/7/2019
你能补充一个明确的问题吗?没有一个
0赞 mob 2/7/2019
my ($first) = @array
0赞 ikegami 2/7/2019
@ysth,从技术上讲,有 8 个问题。但请随意重写。
0赞 ikegami 2/7/2019
@mob,当然!添加

答:

7赞 ikegami 2/7/2019 #1

[这个答案也可以在这里以表格形式找到。]

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

  • 如果 a 的左侧 (LHS) 是某种聚合,则使用列表赋值运算符 ()。aassign=
  • 否则使用标量赋值运算符 ()。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;
    

返回的值

这两个运算符返回的内容不同。

  • 标量赋值...

    • ...在标量上下文中,将其 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);
      

评论

0赞 ysth 2/7/2019
更改为仅表示数组或哈希或数组或哈希切片,以包含 PostDeref 语法
0赞 ikegami 2/7/2019
@ysth,啊,是的,最初写这篇文章时,这些并不存在