Por que o Perl não perde (iterar) todo o hash pela segunda vez?

Eu tenho um script simples tentando aprender sobre hashes em Perl.

#!/usr/bin/perl

my %set = (
    -a => 'aaa',
    -b => 'bbb',
    -c => 'ccc',
    -d => 'ddd',
    -e => 'eee',
    -f => 'fff',
    -g => 'ggg'
);

print "Iterate up to ggg...\n";
while ( my ($key, $val) = each %set ) {
    print "$key -> $val \n";
    last if ($val eq 'ggg');
}
print "\n";

print "Iterate All...\n";
while ( my ($key, $val) = each %set ) {
    print "$key -> $val \n";
}
print "\n";

Estou surpreso com a saída:

Iterate upto ggg...
-a -> aaa
-c -> ccc
-g -> ggg

Iterate All...
-f -> fff
-e -> eee
-d -> ddd
-b -> bbb

Eu entendo que as chaves estão com hash, então a primeira saída pode ser 'n' elementos dependendo da ordem interna. Mas por que não sou capaz de fazer o loop da matriz depois? O que há de errado ?

Obrigado,

questionAnswers(2)

yourAnswerToTheQuestion