2010-03-12 4 views

ответ

12

Я думаю, что вы вспомнить тот факт, что если вы

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.

+0

Или sid_com помнит о ... (... each% hash) {... modify% hash ...} – ysth

+0

Спасибо. Просто искал эту информацию. – 0xC0000022L

0

Но, если вы хотите изменить имя ключа.

вы можете удалить ключи из хэша, , затем создать ключ с существующими значениями , как вы хотите. это может быть одна работа вокруг этого требования

5

См keys функцию manpage:

Возвращаемые значения являются копиями оригинальных ключей в хэш, поэтому их изменение не повлияет на оригинал хэш. Сравните «значения».

Вы можете удалить или изменить элементы хэша путем подписи, например.

delete $hash{$key}; 
$hash{$key} = "foo"; 
1

вы не можете переименовать любое ключевое значение вместо этого вы можете удалить и создать новый один , который не меньше, чем переименование ключа! :-)

for my $key (keys %hash) { 
    delete $hash{$key}; 
    $hash{$key} = "$key_x"; 
} 
+0

Утверждение abubacker является правильным (и важно, и не указано явно в принятом ответе), хотя оно не имеет ничего общего с петлями; почему downvotes? например, пример должен быть $ hash {$ newkey} = delete $ hash {$ key}. – ysth

+0

@ysth Думал, что он, должно быть, новичок, не хочет путать его, иногда мы не всегда должны думать в нашей точке зрения, мой друг, надеюсь, что вы измените нисходящие голоса :-) – abubacker

4

Способ сделать это будет

$hash{$newkey} = delete $hash{$oldkey}; 
Смежные вопросы