>>780 サンクスコ。実は効率の点からも、foreach (keys %hash) より each の方が優れていることが確認できますた _| ̄|○
foreach (keys %hash) ってコスト高いみたいね。
要素 40 万個の %hash で、
a: foreach (keys %hash) とした場合; b: each 使った場合; c: keys %hash でリセット後 each 使った場合
の 3 パターンをベンチしたら、所要時間が、a > b ≒ c ですた。
void コンテキストでの keys %hash は早いみたい。(void コンテキストでなくすと、c の速度は 3 秒増した。)

プログラム:
use Benchmark; use strict;
my %hash; for (my $i = 0; $i < 400000; ++$i) { $hash{"ke${i}y"} = $i; }
print "Start!\n";
timethese 10, { a => \&a, b => \&b, c=>\&c };
my @z; sub foo($) { push @z, $_[0]; }
sub a { @z = (); my ($key, $val); foreach (keys %hash) { ($key, $val) = ($_, $hash{$_}); foo($key); foo($val); } }
sub b { @z = (); my ($key, $val); while (($key, $val) = each(%hash)) { foo($key); foo($val); } }
sub c { @z = (); keys %hash; my ($key, $val); while (($key, $val) = each(%hash)) { foo($key); foo($val); } }

結果:
Benchmark: timing 10 iterations of a, b, c...
     a: 18 wallclock secs (17.66 usr + 0.09 sys = 17.75 CPU) @ 0.56/s (n=10)
     b: 13 wallclock secs (13.09 usr + 0.00 sys = 13.09 CPU) @ 0.76/s (n=10)
     c: 14 wallclock secs (13.84 usr + 0.00 sys = 13.84 CPU) @ 0.72/s (n=10)