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)