2009-09-29 19 views
16

Digamos que si tengo un hash de esta manera:¿Cómo reemplazar una clave hash Perl?

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

Ahora, ¿cómo puedo reemplazar el la tecla 'key5' con algún otro nombre clave de decir 'key6'? Sé cómo recorrer el hash & volcar los valores, pero no sé cómo reemplazar las claves o los valores en su lugar. Gracias por tu ayuda.

Respuesta

40

El operador delete devuelve el valor que se va a eliminar. Así que esto

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

hará lo que usted está buscando.

+0

¡Oh, claro! Me olvide de eso. Desactivado para modificar mi 'hash_replace()' –

+0

Gracias por eso. De hecho, ni siquiera sabía que era posible hacerlo de esa manera – John

9

no se puede reemplazar, pero se puede hacer un duplicado de la llave con facilidad, y luego delete() la anterior:

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

Por supuesto, usted podría hacer una subrutina bastante simple de hacer esto. Sin embargo, mi primer enfoque fue incorrecto, y necesitaría hacer un enfoque más complejo que pase en la estructura de datos para modificar y el elemento a modificar, y dado que desea elementos de varios niveles, esto puede ser difícil. Aunque si no te importa un poco de desorden:

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

Entonces llamarlo:

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

O la forma en fresco (¿Qué mejor para decir que estamos transformando "key5" en "key6" ?):

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

(probado y funciona)

+0

algún motivo para una downvote? ¿Algo no funciona aquí? –

+0

Esto es genial, gracias por su ayuda. Este ejemplo es realmente bueno para mí para entender cómo abordar esto. – John

0

Este 'funciona', pero es muy difícil codificado.

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

puede eliminar los - operadores entre los subíndices de hash, pero no el que después de '$ data' '>' - como en la solución de Chris Lutz.

+0

Siempre preferí usar el menor número de '->' con los que pudiera salir, pero puedo ver cómo comienza a ponerse peludo rápidamente. –

1

puede usar YAML a sumergirse profundamente en su hash con un simple expresión regular:

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