Perl:Multiple=';一行中的s符号(列表和标量上下文混淆)

Perl:Multiple=';一行中的s符号(列表和标量上下文混淆),perl,Perl,我在Perl教程中看到了这一行: $ret = (($i, $j, $k)=(5,6,8,9)); # 4 我不熟悉在一行中有多个class='s符号的格式。从我所读到的来看,它与上下文有关 对我来说,用另一对括号将($i,$j,$k)=(5,6,8,9)包装起来似乎很奇怪,但我将其视为在列表上下文中解释包装好的文本 但是,为什么下面的不同呢?=()=不是同样的意思吗?为什么赋值在列表上下文之前发生 $ret = () = ($i, $j, $k)=(5,6,8,9); # 3 而下面的又是

我在Perl教程中看到了这一行:

$ret = (($i, $j, $k)=(5,6,8,9)); # 4
我不熟悉在一行中有多个class='s符号的格式。从我所读到的来看,它与上下文有关

对我来说,用另一对括号将
($i,$j,$k)=(5,6,8,9)
包装起来似乎很奇怪,但我将其视为在列表上下文中解释包装好的文本

但是,为什么下面的不同呢?
=()=
不是同样的意思吗?为什么赋值在列表上下文之前发生

$ret = () = ($i, $j, $k)=(5,6,8,9); # 3
而下面的又是4

$ret = ($i, $j, $k)=(5,6,8,9); # 4 

一个常见的误解是,以下情况将
A
分配给
b

b=a=3

但是您不会期望以下内容将
a
分配给
b
,对吗

b=a+3

您必须查看
=
的计算结果(返回值)

根据,

  • 列表上下文中的列表赋值计算为其LHS作为左值返回的标量
  • 标量上下文中的列表赋值计算为其RHS返回的标量数

赋值具有从右到左的关联性,因此

 $ret = () = ($i, $j, $k) = (5, 6, 8, 9);
意味着

  • 第一个赋值运算符是列表上下文中的列表赋值。它计算LHS返回的标量作为左值(
    $i,$j,$k
  • 第二个赋值运算符是标量上下文中的列表赋值。它的计算结果是其RHS返回的标量数(
    3
  • 第三个赋值运算符将此赋值给
    $ret

  • 同样地

     $ret = ($i, $j, $k) = (5, 6, 8, 9);
    
    意味着

  • 第二个赋值运算符是标量上下文中的列表赋值。它的计算结果是其RHS返回的标量数(4)
  • 第二个赋值运算符将此赋值给
    $ret
  • 参考
    $ret=(()=($i,$j,$k)=(5,6,8,9)),我不明白为什么#2是“标量上下文中的列表赋值”,特别是为什么它是在标量上下文中<代码>()=($i,$j,$k)
    。这里的lhs和rhs看起来都像列表。因为#3是标量赋值,标量赋值在其参数上施加了标量上下文(lhs=
    $ret
    ,rhs=#2)
     $ret = ($i, $j, $k) = (5, 6, 8, 9);
    
          2                1
     $ret = ( ($i, $j, $k) = (5, 6, 8, 9) );