b 我期望标量在标量上下文中返回列表 - 它的长度。 为什么它返回第二个(最后一个)元素? 它适用-6ren">
gpt4 book ai didi

arrays - Perl:匿名列表的长度

转载 作者:行者123 更新时间:2023-12-02 15:44:52 24 4
gpt4 key购买 nike

如何获取匿名列表的长度?

perl -E 'say scalar ("a", "b");' # => b

我期望标量在标量上下文中返回列表 - 它的长度。

为什么它返回第二个(最后一个)元素?

它适用于数组:

perl -E 'my @lst = ("a", "b"); say scalar @lst;' # => 2

最佳答案

你可以使用

my $n = () = f();

根据您的情况,它是

say scalar( () = ("a", "b") );

say 0+( () = ("a", "b") );
<小时/>

首先,让我们澄清一个误解。

您似乎相信某些运算符会计算某种称为列表的数据结构,而不管上下文如何,并且该列表在强制转换为标量上下文时返回其长度。

所有这些都是不正确的。

运算符必须在标量上下文中精确地求出一个标量,并且 sub 必须在标量上下文中精确地返回一个标量。在列表上下文中,运算符可以计算任意数量的标量,而 subs 可以返回任意数量的标量。因此,当我们说运算符计算结果为列表时,以及当我们说子返回列表时,我们并不是指某些数据结构;而是指某些数据结构。我们只是使用“列表”作为“零个或多个标量”的简写。

由于不存在列表数据结构之类的东西,因此无法将其强制转换为标量。语境不是强制,而是强制。上下文是运算符(operator)检查的内容,以确定他们首先评估的内容。他们确实让上下文决定了他们的行为和返回的内容。由每个运算符决定它们在标量和列表上下文 and there's a lot of variance 中返回什么。

正如您所指出的,

  • 标量上下文中的 @a 运算符计算结果为单个标量:数组的长度。
  • 标量上下文中的逗号运算符计算结果为单个标量:与其最后一个操作数相同的值。
  • 标量上下文中的 qw 运算符计算结果为单个标量:通常返回的最后一个值。
<小时/>

回答你的问题。

为了确定在列表上下文中计算时运算符将计算多少个标量,我们需要在列表上下文中计算运算符。运算符始终在标量上下文中计算为单个标量,因此您强加标量上下文的尝试是没有根据的(除非运算符碰巧计算出它在列表上下文中返回的长度,就像 @a 的情况一样,但不适用于许多其他运算符)。

解决方案是使用

my $n = () = f();

explanation 很复杂。

关于arrays - Perl:匿名列表的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57335742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com