2

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

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最左边?

4

2 回答 2

3

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

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

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

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

于 2020-04-28T16:25:02.510 回答
2

现在开始学习 Perl 的人越来越少,原因之一是它有一些像你的例子一样晦涩难懂的代码。检查土星的 perlsecret 页面https://metacpan.org/pod/distribution/perlsecret/lib/perlsecret.pod#Goatse

=( )=

(别名:“土星”)

如果您不了解此运算符的名称,请认为自己很幸运。建议您不要在网上搜索直观的解释。

goatse 运算符在其右侧提供一个列表上下文,并在其左侧返回元素的数量。请注意,左侧必须提供标量上下文;显然,左侧的列表上下文将在中间接收空列表。

解释是标量上下文中的列表赋值返回赋值右侧的元素数量,无论这些元素中有多少实际分配给变量。在这种情况下,右侧的所有元素都被简单地分配给一个空列表(因此被丢弃)。

于 2020-04-28T16:42:09.957 回答