perl 标量与列表赋值运算符

4urapxun  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(200)

请帮助我理解以下片段:

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

u3r8eeie1#

[* 此答案也可在表格格式here中找到。*]
符号=被编译成两个赋值运算符之一:

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

以下被视为聚合物:

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

运算符之间有两个区别。

操作数上下文

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

  • 标量赋值在标量上下文中计算其两个操作数。
  1. # @array evaluated in scalar context.
  2. my $count = @array;
  • 列表赋值在列表上下文中计算其两个操作数。
  1. # @array evaluated in list context.
  2. my @copy = @array;
  1. # @array evaluated in list context.
  2. my ($first) = @array;

返回的值

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

  • 标量赋值...
  • ...在标量上下文中将其LHS作为左值计算。
  1. # The s/// operates on $copy.
  2. (my $copy = $str) =~ s/\\/\\\\/g;
  • ...在列表上下文中将其LHS作为左值计算。
  1. # Prints $x.
  2. print($x = $y);
  • 列表分配...
  • ...在标量上下文中计算为其RHS返回的标量数。
  1. # Only dies if f() returns an empty list.
  2. # This does not die if f() returns a
  3. # false scalar like zero or undef.
  4. my ($x) = f() or die;
  1. # $counts gets the number of scalars returns by f().
  2. my $count = () = f();
  • ...在列表上下文中,计算其LHS作为左值返回的标量。
  1. # Prints @x.
  2. print(@x = @y);
展开查看全部

相关问题