在 Perl 中如何按列表分配进行字数统计?
How does word counting by list assignment work in Perl?
我无法完全理解以下代码片段的工作原理:
my $str = 'abc def ghi';
my $num = () = $str =~ /\w+/g;
say $num; # prints the word count, 3
我知道 $str =~ /\w+/g
returns 一个单词列表,显然,它被传送到最左边的赋值。然后 $num
对该列表施加标量上下文并变为 3.
但是() = ('abc', 'def', 'ghi')
是什么意思呢?是不是有点像 my $a = my @b = (3, 5, 8)
?如果是这样,最右边的列表是如何转移到最左边的$num
的?
每个 perl 运算符在列表和标量上下文中都有特定的行为。运算符为它们的操作数提供上下文,但从它们作为操作数的对象接收上下文。
当列表赋值放在标量上下文中时,它 returns 赋值右侧的元素数。这会启用如下代码:
while (my @pair = splice(@array, 0, 1)) {
= () =
的处理方式没有什么特别之处;你也可以做 = ($dummy) =
或 = (@dummy) =
;关键部分是您希望匹配是列表上下文(产生所有可能的匹配),然后只计算它们的数量。
所以你做了一个列表赋值(这就是 =
在有括号表达式或数组或切片作为左操作数时所做的事情)但是由于你实际上并不想要这些值,你可以使用空列表。然后将其置于标量上下文中;在本例中,使用列表赋值作为标量赋值的右操作数。
现在开始学习 Perl 的人越来越少,原因之一是它有一些像您的示例一样晦涩难懂的代码。
检查 Saturn https://metacpan.org/pod/distribution/perlsecret/lib/perlsecret.pod#Goatse
的 perlsecret 页面
=( )=
(备用昵称:"Saturn")
如果你不明白这个操作员的名字,那你就走运了。视觉解释建议大家不要上网搜索。
goatse 运算符在其右侧提供列表上下文,returns 在其左侧提供元素数。请注意,左侧必须提供标量上下文;显然,左侧的列表上下文将接收中间的空列表。
解释是标量上下文中的列表赋值 returns 赋值右侧的元素数量,无论这些元素中有多少实际上被赋给了变量。在这种情况下,右侧的所有元素都被简单地分配给一个空列表(因此被丢弃)。
我无法完全理解以下代码片段的工作原理:
my $str = 'abc def ghi';
my $num = () = $str =~ /\w+/g;
say $num; # prints the word count, 3
我知道 $str =~ /\w+/g
returns 一个单词列表,显然,它被传送到最左边的赋值。然后 $num
对该列表施加标量上下文并变为 3.
但是() = ('abc', 'def', 'ghi')
是什么意思呢?是不是有点像 my $a = my @b = (3, 5, 8)
?如果是这样,最右边的列表是如何转移到最左边的$num
的?
每个 perl 运算符在列表和标量上下文中都有特定的行为。运算符为它们的操作数提供上下文,但从它们作为操作数的对象接收上下文。 当列表赋值放在标量上下文中时,它 returns 赋值右侧的元素数。这会启用如下代码:
while (my @pair = splice(@array, 0, 1)) {
= () =
的处理方式没有什么特别之处;你也可以做 = ($dummy) =
或 = (@dummy) =
;关键部分是您希望匹配是列表上下文(产生所有可能的匹配),然后只计算它们的数量。
所以你做了一个列表赋值(这就是 =
在有括号表达式或数组或切片作为左操作数时所做的事情)但是由于你实际上并不想要这些值,你可以使用空列表。然后将其置于标量上下文中;在本例中,使用列表赋值作为标量赋值的右操作数。
现在开始学习 Perl 的人越来越少,原因之一是它有一些像您的示例一样晦涩难懂的代码。 检查 Saturn https://metacpan.org/pod/distribution/perlsecret/lib/perlsecret.pod#Goatse
的 perlsecret 页面=( )=
(备用昵称:"Saturn")
如果你不明白这个操作员的名字,那你就走运了。视觉解释建议大家不要上网搜索。
goatse 运算符在其右侧提供列表上下文,returns 在其左侧提供元素数。请注意,左侧必须提供标量上下文;显然,左侧的列表上下文将接收中间的空列表。
解释是标量上下文中的列表赋值 returns 赋值右侧的元素数量,无论这些元素中有多少实际上被赋给了变量。在这种情况下,右侧的所有元素都被简单地分配给一个空列表(因此被丢弃)。