标量与列表赋值运算符
Posted
技术标签:
【中文标题】标量与列表赋值运算符【英文标题】: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,当然!已添加
【参考方案1】:
符号=
被编译为两个赋值运算符之一:
=
的左侧 (LHS) 是某种聚合,则使用 列表赋值运算符 (aassign
)。
标量赋值运算符 (sassign
) 用于其他情况。
以下被认为是聚合:
括号中的任何表达式(例如(...)
)
一个数组(例如@array
)
一个数组切片(例如@array[...]
)
哈希(例如%hash
)
一个哈希片(例如@hash...
)
上述任何一个前面都带有my
、our
或local
运算符之间有两个区别。
操作数上下文
这两个运算符在计算其操作数的上下文中有所不同。
标量赋值在标量上下文中计算它的两个操作数。
# @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时,那些并不存在@以上是关于标量与列表赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章