繁体   English   中英

Perl:一行中有多个=符号(列表和标量上下文混淆)

[英]Perl: Multiple ='s signs in one line (list and scalar context confusion)

我从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 

一个常见的误解是以下代码将a分配给b

b = a = 3

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

b = a + 3

您必须查看=得出的结果(返回)。

按照Mini-Tutorial:标量vs列表赋值运算符

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

作业具有从右到左的关联性,因此

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

手段

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

同样

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

手段

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM