首页 > 解决方案 > Perl 中如何通过列表分配进行字数统计?

问题描述

我无法完全理解以下代码段的工作原理:

my $str = 'abc def ghi';
my $num = () = $str =~ /\w+/g;
say $num; # prints the word count, 3

我知道这会$str =~ /\w+/g返回一个单词列表,显然,这些单词被传达给最左边的作业。然后$num在该列表上施加一个标量上下文并变为 3。

但这是什么() = ('abc', 'def', 'ghi')意思?是这样的my $a = my @b = (3, 5, 8)吗?如果是这样,最右边的列表如何转移到$num最左边?

标签: perlinitializationscalar-context

解决方案


每个 perl 运算符在列表和标量上下文中都有特定的行为。运算符为其操作数提供上下文,但从它们作为操作数的对象中接收上下文。当列表赋值被放置在标量上下文中时,它返回赋值右侧的元素数。这启用了如下代码:

while (my @pair = splice(@array, 0, 1)) {

处理方式没有什么特别之处= () =;你也可以做= ($dummy) =or = (@dummy) =; 关键部分是您希望匹配是列表上下文(产生所有可能的匹配),然后只获取它们的计数。

所以你做了一个列表赋值(=只要有一个带括号的表达式或一个数组或切片作为左操作数),但由于你实际上并不想要这些值,你可以使用一个空列表。然后将其置于标量上下文中;在这种情况下,使用列表赋值作为标量赋值的右操作数。


推荐阅读