列表中的值的数量只能通过迭代其值或将其转换为数组来确定.将其分配给标量不会返回项目计数:
my $n = ('a','b','c'); # $n = 'c'
my $n = () = ('a','c'); # $n = 3
它在内部是等同的
my $n = @{[ 'a','c' ]};
?
解决方法
这是一个有趣的实现细节:对空列表的赋值是否会创建(不必要的)匿名数组?
有两种方法可以回答这个问题:第一,正确的方法:尝试弄清楚如何在源中处理这个问题.是否有一个特殊情况可以分配给在标量上下文中评估的空列表?
作为懒惰和无知的类型,我选择使用Benchmark:
#!/usr/bin/perl use strict; use warnings; use Benchmark qw( cmpthese ); cmpthese -5,{ goatse => sub { my $n = () = 'A' .. 'Z' },anon => sub { my $n = @{[ 'A' .. 'Z' ]}},};
我经常运行基准测试,并且在所有情况下,对空列表的分配都略有优势.如果差异纯粹是随机的,那么观察10个有利于goatse的时间的概率小于0.1%,所以我假设存在某种短路.
另一方面,正如运行评论中发布的基准@daotoad,可能会给出更完整的图片:
#!/usr/bin/perl use strict; use warnings; use Benchmark qw( cmpthese ); use constant START => 1; use constant STOP => 1000; my $start = START; my $stop = STOP; cmpthese -5,{ anon => sub { my $n = @{[ $start .. $stop ]}},goatse => sub { my $n = () = $start .. $stop },canon => sub { my $n = @{[ START .. STOP ]}},cgoatse => sub { my $n = () = START .. STOP },};
我机器上的典型结果(Windows XP Pro SP3,Core 2 Duo,2 Gb内存,ActiveState perl 5.10.1.1006):
Rate anon cgoatse goatse canon anon 5207/s -- -45% -49% -51% cgoatse 9522/s 83% -- -7% -10% goatse 10201/s 96% 7% -- -4% canon 10636/s 104% 12% 4% --
与:
use constant START => 'AAAA'; use constant STOP => 'ZZZZ';
结果是:
Rate anon goatse cgoatse canon anon 1.73/s -- -12% -16% -17% goatse 1.98/s 14% -- -4% -5% cgoatse 2.06/s 19% 4% -- -1% canon 2.08/s 20% 5% 1% --
结论:
如果有疑问,请使用我的$n =()= …;