Perl:匿名列表的长度

Perl: Length of an anonymous list

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

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

我预计 scalar 到 return 标量上下文中的列表 - 它的长度。

为什么它 return 是第二个(最后一个)元素?

它适用于数组:

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

一种方式

perl -wE'$len = () = qw(a b c); say $len'   #--> 3

= () = "operator" is a play on context. It forces list context on its right side and assigns the length of the list. See about list vs scalar assignments and this page 对这一切的一些想法。

如果这需要在列表上下文中使用,那么 LHS 上下文也可以由 scalar 强制使用,例如

say scalar( () = qw(a b c) );

或通过其他方式 (0+...),但 scalar 在这种情况下实际上是合适的,也是最清楚的。


在您的诚实尝试中,scalar 将标量上下文强加于其操作数——或者这里是一个 表达式,因此由 comma operator 计算,由此一个接一个地被丢​​弃,直到返回最后一个。

你会通过警告了解它,因为它会发出

Useless use of a constant ("a") in void context at -e line 1

也可以在单行中始终启用警告,使用 -w 标志。我推荐。

你可以使用

my $n = () = f();

适用于您的情况,

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

say 0+( () = ("a", "b") );

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

您似乎相信某些运算符会在不考虑上下文的​​情况下对某种称为列表的数据结构求值,并且此列表 return 在强制转换为标量上下文时会达到其长度。

所有这些都不正确。

运算符必须在标量上下文中评估为恰好一个标量,而子运算符必须return在标量上下文中恰好为一个标量。在列表上下文中,运算符可以评估任意数量的标量,而 subs 可以 return 任意数量的标量。因此,当我们说一个运算符计算出一个列表时,以及当我们说一个子 return 是一个列表时,我们并不是指某个数据结构;我们只是将“列表”用作“零个或多个标量”的 shorthand。

由于不存在列表数据结构,因此无法将其强制转换为标量。上下文不是强制;上下文是操作员检查以确定他们首先评估的内容。他们从字面上让上下文决定他们的行为和他们return。由每个操作员决定他们在标量和列表上下文中 return and there's a lot of variance.

如您所见,

  • 标量上下文中的 @a 运算符计算为单个标量:数组的长度。
  • 标量上下文中的逗号运算符计算为单个标量:与其最后一个操作数的值相同。
  • 标量上下文中的 qw 运算符计算为单个标量:它通常 return.
  • 的最后一个值

关于你的问题。

要确定运算符在列表上下文中计算时将计算多少个标量,我们需要在列表上下文中计算运算符。运算符总是在标量上下文中评估为单个标量,因此您强加标量上下文的尝试是没有根据的(除非运算符恰好评估了它在列表上下文中 returned 的长度,因为@a 是这种情况,但许多其他运算符则不是。

解决方法是使用

my $n = () = f();

比较复杂

Perl 引用很难。我不会让您阅读 prelref 因为这不是任何人都可以阅读并开始使用的东西。

长话短说,使用此模式获取匿名数组大小:0+@{[ <...your array expression...> ]}

示例:

print 0+@{[ ("a", "b") ]};