【问题标题】:Scalar vs List Assignment Operator标量与列表赋值运算符
【发布时间】:2019-07-01 01:03:11
【问题描述】:

请帮我理解下面的sn-ps:

  • 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);

【问题讨论】:

  • 你能添加一个明确的问题吗?没有一个
  • my ($first) = @array
  • @ysth,从技术上讲,有 8 个问题。但请随意重写。
  • @mob,当然!已添加

标签: perl assignment-operator


【解决方案1】:

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

  • 如果= 的左侧 (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);
      

【讨论】:

  • 更改为仅表示数组或哈希或数组或哈希切片,以包含 postderef 语法
  • @ysth,啊,是的,当这是originally written时,那些并不存在@
猜你喜欢
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 2020-08-10
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多