ハッシュの内容を全て出力するには、いくつかの方法がある。
代表的な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; }