Я думаю, что вы вспомнить тот факт, что если вы
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
.
Или sid_com помнит о ... (... each% hash) {... modify% hash ...} – ysth
Спасибо. Просто искал эту информацию. – 0xC0000022L