代码之家  ›  专栏  ›  技术社区  ›  mpapec

标量与列表上下文

  •  6
  • mpapec  · 技术社区  · 6 年前

    想知道在两种情况下,以下两个例子给出不同结果的理由是什么 do {} 返回列表。

    perl -wE 'say my $r = do {  (44); }'
    44
    
    perl -wE 'say my $r = do {  my ($x) = map $_, 44; }'
    1
    
    2 回复  |  直到 6 年前
        1
  •  7
  •   JGNI    6 年前

    在这两种情况下,对$R的赋值都将强制执行do上的标量上下文。但是,在第一种情况下,列表上的标量上下文返回列表的最后一个值“44”。

    在第二种情况下,分配给 my ($x) 强制列表上下文,在标量上下文中分配给列表的结果是分配右侧的元素数。所以你得到了。

    map $_, 44 返回长度为1的列表,其中包含(44)

    my ($x) = 在列表上下文中分配上面的结果,因为周围有括号 $x 到名单上 ($x) 赚X=44

    这个 do 块在标量上下文中,因为分配给 $r ,注意缺少括号,正如我上面所说,这将返回列表分配右侧的长度。1在这种情况下。

    看看如果你这样做会发生什么:

    perl -wE 'say my $r = () = (1,3,5,7)'
    
        2
  •  5
  •   ikegami Gilles Quénot    6 年前

    首先,两者都不是 do 返回列表。它们是在标量上下文中计算的,因此它们必须返回单个标量,而不是任意数量的标量(“列表”)。

    在第一种情况下, 返回计算结果 44 在标量上下文中。这种回报 四十四 .

    scalar(    44    ) ⇒ 44
    

    在第二种情况下, 返回在标量上下文中计算列表分配的结果。这将返回赋值右侧返回的元素数。

    scalar(    () = 44    ) ⇒ 1
    

    我相信造成你困惑的真正原因是你不知道赋值操作符以及它们是如何受上下文影响的。如果是,请参阅 Scalar vs List Assignment Operator 为了回答你真正的问题。