确定Perl哈希的大小

pca*_*upo 5 perl

我正在浏览GitHub上一个流行的存储库中的一些Perl代码,并运行此方法来计算哈希的大小:

while ( my ($a, undef ) = each %h ) { $num++; }
Run Code Online (Sandbox Code Playgroud)

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

$num = scalar keys %h;
Run Code Online (Sandbox Code Playgroud)

所以,我将这两种方法与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++;
                             }
                         },
});
Run Code Online (Sandbox Code Playgroud)
 RESULTS
                Rate whileloop      keys
 whileloop    5090/s        --     -100%
 keys      7234884/s   142047%        --

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

Sin*_*nür 5

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

my $n = keys %hash;
Run Code Online (Sandbox Code Playgroud)

使用更多的内存比使用迭代所有内容each.

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