each
использует указатель, связанный с хэшем, чтобы отслеживать итерацию. Он не знает, что первый while отличается от второго цикла while, и он сохраняет один и тот же указатель между ними.
Большинство людей избегают each
по этой (и другим) причинам, вместо этого выбирая keys
:
for my $key (keys %hash){
say "$key => $hash{$key}";
}
Это также дает вам контроль над порядком итерации:
for my $key (sort keys %hash){
say "$key => $hash{$key}";
}
В любом случае, если вы собираетесь закончить цикл раньше, избегайте each
.
Кстати, сторонники функционального программирования должны воспользоваться этой возможностью, чтобы указать на недостатки скрытого состояния. То, что выглядит как операция без сохранения состояния («цикл по каждой паре в таблице»), на самом деле довольно полноразмерно.