array perl hash replace

array hash perl



¿Cómo reemplazar una clave de hash Perl? (3)

El operador de delete devuelve el valor que se está eliminando. Así que esto

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

Hará lo que estés buscando.

Digamos si tengo un hash como este:

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

Ahora, ¿cómo puedo reemplazar la clave ''clave5'' con otro nombre de clave como ''clave6''? Sé cómo recorrer el hash y volcar los valores, pero no sé cómo reemplazar claves o valores en su lugar. Gracias por tu ayuda.


Esto ''funciona'' pero está muy 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 hash, pero no el siguiente a ''$ data'', como en la solución de Chris Lutz.


No puede reemplazarlo, pero puede crear una nueva clave fácilmente y luego delete() la antigua:

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

Por supuesto, podrías hacer una subrutina bastante simple para hacer esto. Sin embargo, mi primer enfoque fue incorrecto, y necesitaría realizar un enfoque más complejo que pase por la estructura de datos a 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 llámalo:

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

O la manera fresca (¿qué mejor manera de decir que estamos transformando "key5" en "key6"?):

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

(Probado y funciona)