提问人:ikegami 提问时间:2/7/2019 最后编辑:ikegami 更新时间:9/14/2022 访问量:456
标量与列表赋值运算符
Scalar vs List 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);
答:
7赞
ikegami
2/7/2019
#1
[这个答案也可以在这里以表格形式找到。]
该符号被编译为以下两个赋值运算符之一:=
- 如果 a 的左侧 (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);
评论
0赞
ysth
2/7/2019
更改为仅表示数组或哈希或数组或哈希切片,以包含 PostDeref 语法
0赞
ikegami
2/7/2019
@ysth,啊,是的,最初写这篇文章时,这些并不存在
评论
my ($first) = @array