2010-03-12 10 views

Répondre

12

Je pense que vous souvenir est le fait que si vous faites

for my $item (@array) { 
    ... 
} 

puis ajouter, de supprimer au milieu de @array (par exemple en utilisant splice) n'est pas autorisé, et le résultat si vous l'essayez n'est pas défini. En fait, dans les temps anciens, vous pouviez réellement perler de cette façon. Puisque la liste retournée par keys est une copie, elle est entièrement déterminée au moment où la boucle commence, et l'ajout et la suppression des clés du hachage n'affecteront pas du tout la boucle. Cela signifie que vous pouvez faire des choses comme

for my $key (keys %hash) { 
    $hash{lc $key} = delete $hash{$key}; 
} 

100% en toute sécurité sans vous soucier. Je peux promettre que c'est vrai retour à perl 5.6.1 (avril 2001), qui était quand la note que "les valeurs retournées sont des copies" a été ajoutée à perlfunc, mais il semble que cela soit le cas depuis toujours, et le changement était seulement aux docs.

Depuis $key dans la boucle est aliasé à une valeur dans une liste temporaire, vous pouvez le changer sans rien de mal se passe, mais il n'aura aucun effet sur %hash du tout.

+0

Ou sid_com se souvient de ... (... chaque% hash) {... modify% hash ...} – ysth

+0

Merci. Je cherchais juste cette information. – 0xC0000022L

0

Mais, si vous voulez changer le nom de la clé.

Vous pouvez supprimer les clés du hachage, puis créer la clé avec les valeurs existantes comme vous le souhaitez. cela pourrait être un travail autour de cette exigence

5

Voir la fonction keysmanpage:

Les valeurs renvoyées sont des copies des clés originales du hachage, afin de les modifier n'affectera pas l'original hacher. Comparez les "valeurs".

Vous pouvez supprimer ou modifier des éléments de hachage en les inscrivant, par ex.

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

vous ne pouvez pas renommer une valeur de clé à la place, vous pouvez supprimer et créer un nouveau qui n'est pas moins que de renommer une clé! :-)

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

La déclaration d'abubacker est correcte (et importante, et n'est pas explicitement mentionnée dans la réponse acceptée), bien qu'elle n'ait rien à voir avec les boucles; pourquoi les downvotes? l'exemple devrait probablement être $ hash {$ newkey} = supprimer $ hash {$ key} cependant. – ysth

+0

@ysth Pensé qu'il doit être un débutant ne veut pas le confondre, parfois nous ne devons pas toujours penser à notre point de vue mon ami, j'espère que vous allez changer les votes vers le bas :-) – abubacker

4

La façon de le faire serait

$hash{$newkey} = delete $hash{$oldkey};