如何在Perl列表中找到值的数量?

前端之家收集整理的这篇文章主要介绍了如何在Perl列表中找到值的数量?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
列表中的值的数量只能通过迭代其值或将其转换为数组来确定.将其分配给标量不会返回项目计数:
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 =()= …;

猜你在找的Perl相关文章