Mir*_*pov 2 arrays perl scalar list perl5
如何获取匿名列表的长度?
perl -E 'say scalar ("a", "b");' # => b
Run Code Online (Sandbox Code Playgroud)
我希望scalar在标量上下文中返回列表-它的长度。
为什么返回第二个(最后一个)元素?
它适用于数组:
perl -E 'my @lst = ("a", "b"); say scalar @lst;' # => 2
Run Code Online (Sandbox Code Playgroud)
首先,让我们澄清一个误解。
您似乎相信某些运算符会评估某种称为表的数据结构,而与上下文无关,并且当强制将其转换为标量上下文时,此列表将返回其长度。
所有这些都是不正确的。
一个运算符必须在标量上下文中求值恰好一个标量,而子运算符必须在标量上下文中恰好返回一个标量。在列表上下文中,运算符可以求值到任意数量的标量,并且sub可以返回任意数量的标量。因此,当我们说一个运算符求一个列表,而当说一个子返回一个列表时,我们并不是在指某种数据结构。我们只是使用“列表”作为“零个或多个标量”的简写。
由于没有列表数据结构之类的东西,因此不能将其强制为标量。情境不是强制性的。上下文是操作员首先确定要评估的内容的内容。他们从字面上让上下文确定他们的行为以及返回的结果。由每个运算符决定它们在标量和列表上下文中返回的内容,并且有很多差异。
您已经注意到,
@a标量上下文中的运算符求值为一个标量:数组的长度。qw标量上下文中的运算符求值为一个标量:通常会返回的最后一个值。关于您的问题。
为了确定运算符在列表上下文中进行评估时将评估多少个标量,我们需要在列表上下文中评估该运算符。运算符总是在标量上下文中求值单个标量,因此您施加标量上下文的尝试是没有根据的(除非运算符碰巧求值到列表上下文中将返回的值的长度,例如@a,但不适用于其他许多运营商)。
解决方法是使用
my $n = () = f();
Run Code Online (Sandbox Code Playgroud)
该解释是复杂的。
单程
perl -wE'$len = () = qw(a b c); say $len' #--> 3
Run Code Online (Sandbox Code Playgroud)
在=()=“经营者”是一出戏的上下文。它在右侧强制列表上下文并分配列表的长度。请参阅此帖子,了解列表与标量分配以及有关此方面的想法。
在您的诚实尝试scalar中,在其操作数上添加标量上下文-或此处是一个表达式,该表达式因此由逗号运算符求值,从而丢弃一个又一个术语,直到最后一个返回为止。
您会在警告提示下了解它,因为它会发出
在-e第1行的无效上下文中无用的使用常量(a)
也可以始终在带有-w标记的单行中启用警告。我建议。