2009-09-29 9 views
16

Disons que si j'ai un hachage comme ceci:Comment remplacer une clé de hachage Perl?

$data = { 
    'key1' => { 
       'key2' => 'value1' 
       }, 
    'key3' => { 
       'key4' => { 
          'key5' => 'value2' 
          } 
       }, 
    }; 

Maintenant, comment puis-je remplacer la clé « key5 » avec un autre nom clé dire « key6 »? Je sais comment faire une boucle à travers le hachage & vider les valeurs, mais je ne sais pas comment remplacer les clés ou les valeurs en place. Merci de votre aide.

Répondre

40

L'opérateur delete renvoie la valeur en cours de suppression. Donc ce

$data->{key3}{key4}{key6} = delete $data->{key3}{key4}{key5} 

fera ce que vous cherchez.

+0

Oh, c'est vrai! J'ai oublié cela. Off pour modifier mon 'hash_replace()' –

+0

Merci pour cela. En fait, je ne savais même pas qu'il était possible de le faire de cette façon – John

9

Vous ne pouvez pas le remplacer, mais vous pouvez faire une nouvelle clé facilement, puis delete() l'ancien:

$data->{key3}{key4}{key6} = $data->{key3}{key4}{key5}; 
delete $data->{key3}{key4}{key5}; 

Bien sûr, vous pouvez faire une sous-routine assez simple à faire. Cependant, ma première approche était fausse, et vous auriez besoin de faire une approche plus complexe qui passe dans la structure de données à modifier et l'élément à modifier, et étant donné que vous voulez des éléments à plusieurs niveaux, cela peut être difficile. Bien que si vous ne me dérange un peu fouillis:

sub hash_replace (\%$$) { 
    $_[0]->{$_[2]} = delete $_[0]->{$_[1]}; # thanks mobrule! 
} 

Ensuite, appelez-le:

hash_replace %{$data->{key3}{key4}}, "key5", "key6"; 

Ou la façon cool (Comment mieux dire que nous transformons « key5 » en « key6 » ?):

hash_replace %{$data->{key3}{key4}}, key5 => "key6"; 

(testé et fonctionne)

+0

Quel est le motif de downvote? Est-ce que quelque chose ne fonctionne pas ici? –

+0

C'est génial, merci pour votre aide. Cet exemple est vraiment bon pour moi de comprendre comment aborder cela. – John

0

Ce 'fonctionne', mais est très codé en dur.

#!/bin/perl -w 
use strict; 

my $data = { 
    'key1' => { 
     'key2' => 'value1' 
    }, 
    'key3' => { 
     'key4' => { 
      'key5' => 'value2' 
     } 
    }, 
}; 

print "$data->{key3}->{key4}->{key5}\n"; 

my $save = $data->{key3}->{key4}->{key5}; 
delete $data->{key3}->{key4}->{key5}; 
$data->{key3}->{key4}->{key6} = $save; 

print "$data->{key3}->{key4}->{key6}\n"; 

Vous pouvez éliminer les - opérateurs entre les indices de hachage, mais pas celle d'après « $ data » « > » - comme dans la solution de Chris Lutz.

+0

J'ai toujours préféré utiliser le plus petit nombre de '->' que je pouvais obtenir, mais je peux voir comment il commence à devenir poilu rapidement. –

1

vous pouvez utiliser YAML pour plonger profondément dans votre hachage avec un simple regex:

use YAML::XS; 
my $yaml = Dump $hash; 
$yaml =~ s/key5/key6/; # may wish for global sub 
$hash = Load $yaml; 
Questions connexes