标量与列表赋值运算符

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...) 上述任何一个前面都带有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时,那些并不存在@

以上是关于标量与列表赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章

Learing-Python:Python中的基本运算符

依赖项没有复制 ctor 或赋值运算符时的 C++ 初始化程序列表

Java学习笔记2.3.2 运算符与表达式 - 赋值运算符

Python赋值运算符与非赋值不同

C++ ——赋值运算符重载函数

复制构造函数与赋值运算符(=)有何不同