列表中值的数量只能通过迭代其值或将其转换为数组来确定。将其分配给标量不会返回项目数:
my $n = ('a', 'b', 'c'); # $n = 'c'
有一个“空括号”惯用语,可用于获取元素数:
my $n = () = ('a', 'b', 'c'); # $n = 3
在内部等同于
my $n = @{[ 'a', 'b', '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个时序都偏向于山羊胡子的概率小于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% --
And, with:
use constant START => 'AAAA';
use constant STOP => 'ZZZZ';
结果是:
评分山羊山羊佳能佳能
匿名1.73 / s--12%-16%-17%
山羊胡1.98 / s 14%--4%-5%
go 2.06 / s 19%4%--1%
佳能2.08 / s 20%5%1%-
结论:
如有疑问,请使用
my $n = () = ...;