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

时间:2014-03-04 19:26:18

标签: perl

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

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

我不熟悉在一行中有多个=符号的格式。从我读到的内容来看,它与上下文有关。

我用另一对括号括起($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 

1 个答案:

答案 0 :(得分:3)

一个常见的误解是,以下内容将a分配给b

b = a = 3

但是您不希望以下内容将a分配给b,对吧?

b = a + 3

您必须查看=评估的内容(返回)。

根据Mini-Tutorial: Scalar vs List Assignment Operator

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

作业具有从右到左的关联性,所以

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

装置

       3       2                1
  $ret = ( ()  = ( ($i, $j, $k) = (5, 6, 8, 9) ));
  1. 第一个赋值运算符是列表上下文中的列表赋值。它将其LHS返回的标量评估为左值($i, $j, $k)。
  2. 第二个赋值运算符是标量上下文中的列表赋值。它评估其RHS(3)返回的标量数量。
  3. 第三个赋值运算符将其分配给$ret

  4. 类似地

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

    装置

          2                1
     $ret = ( ($i, $j, $k) = (5, 6, 8, 9) );
    
    1. 第二个赋值运算符是标量上下文中的列表赋值。它评估其RHS(4)返回的标量数量。
    2. 第二个赋值运算符将其分配给$ret