确定Perl哈希的大小

时间:2015-03-01 22:58:20

标签: perl

我在GitHub上的热门存储库中浏览了一些Perl代码,然后运行此方法来计算哈希的大小:

while ( my ($a, undef ) = each %h ) { $num++; }

我想为什么在编写所有代码时会遇到麻烦,因为它可以更简单地写成

$num = scalar keys %h;

所以,我将这两种方法与Benchmark进行了比较。

my %h = (1 .. 1000);
    cmpthese(-10, {
        keys      => sub {
                             my $num  = 0;
                             $num = scalar keys %h;
                         },
        whileloop => sub {
                             my $num = 0;
                             while ( my ($a, undef ) = each %h ) {
                                 $num++;
                             }
                         },
});
 RESULTS
                Rate whileloop      keys
 whileloop    5090/s        --     -100%
 keys      7234884/s   142047%        --

结果显示使用keys比while循环快得多。我的问题是:为什么原始编码器会使用如此慢的方法?有什么东西我不见了吗?还有,有更快的方法吗?

2 个答案:

答案 0 :(得分:5)

我无法读懂任何人可能写过这段代码的想法,但他/她可能会想:

my $n = keys %hash;

使用更多内存而不是使用each迭代所有内容。

请注意,赋值左侧的标量会创建标量上下文:除非您希望在列表上下文中创建标量上下文,否则不需要scalar

答案 1 :(得分:4)

因为他不知道keys能否返回哈希中的元素数量。