列表中值的数量只能通过迭代其值或将其转换为数组来确定。将其分配给标量不会返回项目数:

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 = () = ...;

07-24 09:47
查看更多