【发布时间】:2011-04-28 20:26:54
【问题描述】:
Perl 中的“goatse 运算符”或=()= 习惯用法导致表达式在列表上下文中进行计算。
一个例子是:
my $str = "5 and 4 and a 3 and 2 1 BLAST OFF!!!";
my $count =()= $str =~ /\d/g; # 5 matches...
print "There are $count numbers in your countdown...\n\n";
当我解释使用时,会发生以下情况:
-
$str =~ /\d/g匹配所有数字。g开关和列表上下文会生成这些匹配项的列表。让这成为“列表生产者”示例,在 Perl 中这可能是很多东西。 -
=()=导致分配给一个空列表,因此所有实际匹配项都被复制到一个空列表中。 - 在标量上下文中对 2 中生成的列表的 $count 赋值。给出列表的计数或 5 的结果。
- 在标量赋值后,空列表
=()=的引用计数变为零。然后列表元素的副本被 Perl 删除。
关于效率的问题如下:
- 我的解析方式错了吗?
- 如果您有一些 List Producer 并且您只对计数感兴趣,是否有更有效的方法来执行此操作?
这个简单的列表很好用,但如果列表有数十万个匹配项怎么办?使用这种方法,您将生成每个匹配项的完整副本,然后将其删除以计算它们。
【问题讨论】:
-
它不如设计一个定制的微芯片来实现你的程序那么高效。
-
为什么投反对票?这不是一个关于效率和习语之间权衡的公平问题吗?
-
抱歉,我忍不住成为
[goatse]的标签创建者。 :D -
列表没有引用计数;它们总是短暂的
-
@Ether:你要写标签 wiki 条目吗?
标签: performance perl operators idioms goatse