Я думаю, что вы помните тот факт, что если вы делаете
for my $item (@array) {
...
}
добавление или удаление элементов в середине @array
(например, с помощью splice
) не разрешается, и результат, если вы попытаетесь это сделать, не определен. На самом деле, в старые времена вы могли так и сломать Perl.
Поскольку список, возвращаемый keys
, является копией, он полностью определяется в момент запуска цикла, и добавление и удаление ключей из хеша вообще не повлияет на цикл. Это означает, что вы можете делать такие вещи, как
for my $key (keys %hash) {
$hash{lc $key} = delete $hash{$key};
}
100% безопасно, не беспокоясь. Я могу пообещать, что это верно в отношении Perl 5.6.1 (апрель 2001 г.), когда в perlfunc было добавлено примечание, что «возвращаемые значения являются копиями», но, похоже, так было всегда, и изменение было в документы.
Поскольку $key
в цикле имеет псевдоним для значения во временном списке, вы можете изменить его без каких-либо плохих событий, но это никак не повлияет на %hash
.