ハッシュのキーと値を全て取り出す - Perl

ハッシュの内容を全て出力するには、いくつかの方法がある。

代表的な3つの方法

まずはもっともシンプルな方法。だが、もっとも使用しないだろう方法。ハッシュのキーと値がずらずら~とただ表示される

print %ENV;

次に代表的な3つの方法を紹介する。 いずれも「キー,値 <改行>」の組み合わせで全要素が表示される。どれを使うかは状況次第。また個人の趣味もあるだろう。

1. while, each構文

while( ($name, $value) = each %ENV ){
    print "$name,$value\n"
}

2. foreach, keys構文

foreach my $name ( keys %ENV ){
    print "$name,$ENV{$name}\n";
}

3. map, keys構文

map{ print "$_,$hash{$_}\n" } keys %ENV;

ベンチマーク

念のため以下のようにベンチマークを取ってみた。while遅いですね。mapとforeachは良い勝負です。

Benchmark: timing 100000 iterations of FOREACH, MAP, WHILE...
   FOREACH:  7 wallclock secs ( 7.64 usr +  0.00 sys =  7.64 CPU) @ 13087.29/s (n=100000)
       MAP:  7 wallclock secs ( 6.68 usr +  0.00 sys =  6.68 CPU) @ 14970.06/s (n=100000)
     WHILE: 10 wallclock secs ( 9.88 usr +  0.01 sys =  9.89 CPU) @ 10107.14/s (n=100000)
use Benchmark;

#-------------------------------------#
#ベンチマーク
#-------------------------------------#
timethese(
    100000,
    {
          'WHILE'   => 'while1();'
        , 'FOREACH' => 'foreach1();'
        , 'MAP'     => 'map1();'
    }
);

sub while1{
    my $str = '';

    while( my($name, $value) = each %ENV ){
        $str = "$name,$value";
    }
}

sub foreach1{
    my $str = '';

    foreach my $name ( keys %ENV ){
        $str = "$name,$ENV{$name}";
    }
}

sub map1{
    my $str = '';

    map{ $str = "$_,$hash{$_}" } keys %ENV;
}