2009-09-29 8 views
16

Diciamo se ho un hash come questo:Come sostituire una chiave hash Perl?

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

Ora, come posso sostituire il tasto 'key5' con qualche altro nome chiave dire 'key6'? So come eseguire il ciclo attraverso l'hash & scaricare i valori ma non so come sostituire le chiavi oi valori sul posto. Grazie per l'aiuto.

risposta

40

L'operatore delete restituisce il valore eliminato. Quindi questo

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

farà quello che stai cercando.

+0

Oh, giusto! L'ho dimenticato. Off per modificare il mio 'hash_replace()' –

+0

Grazie per quello. In realtà non sapevo nemmeno che fosse possibile farlo in quel modo – John

9

Non è possibile sostituirlo, ma si può fare una nuova chiave con facilità, e poi delete() quello vecchio:

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

Naturalmente, si potrebbe fare un abbastanza semplice subroutine per fare questo. Tuttavia, il mio primo approccio era sbagliato, e avresti bisogno di fare un approccio più complesso che passi nella struttura dati da modificare e l'elemento da modificare, e dato che vuoi elementi di diversi livelli in profondità questo può essere difficile. Anche se non vi dispiace un po 'di disordine:

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

Poi chiamarlo:

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

O il modo fresco (Quale modo migliore per dire che stiamo trasformando "key5" in "key6" ?):

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

(testato e funziona)

+0

Qual è il motivo per un downvote? Qualcosa non funziona qui? –

+0

Questo è fantastico, grazie per il vostro aiuto. Questo esempio è davvero buono per me capire come avvicinarsi a questo. – John

0

Questo 'funziona', ma è molto hard-coded.

#!/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"; 

è possibile eliminare i - operatori tra gli indici hash, ma non quello dopo '$ data' '>' - come nella soluzione di Chris Lutz.

+0

Ho sempre preferito usare il minor numero di '->' che potevo farla franca, ma posso vedere come inizia a diventare peloso rapidamente. –

1

è possibile utilizzare YAML di immergersi in profondità nel vostro hash con una semplice espressione regolare:

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