Hola.
Trato de duplicar un hash de arrays (%fichero1), porque tengo que recorrerlo dos veces haciendo shift() sobre los elementos de los arrays hasta que queda uno, y al final un delete() sobre la
key.
El problema es que, como tengo que hacer esto dos veces sobre el mismo
hash, pues se me han ocurrido dos opciones, ninguna de las cuales me funciona por motivos que desconozco.
El programa es extensísimo, así que a ver si puedo sintetizar lo importante. Del %fichero2 nos podemos olvidar, que no interesa para la cuestión.Opción 1:
Pasar la primera vez el
array a la función (que realiza los shift() y el delete()) por valor, en lugar de por referencia. Así la primera vez trabajo sobre una copia y la segunda ya puedo eliminar los datos sobre el original:
Usando Coloreado de perl
funcion(%fichero1,\%fichero2);
funcion(\%fichero1,\%fichero2);
Esto me da un error que traducido viene a decir que "no se pueden utilizar falsos hashes". Creo que no se pueden pasar
hashs por valor, corregidme si me equivoco.
Opción 2:
Usando Coloreado de perl
my %fichero1_copia = %fichero1;
use Data::Dumper;
print Dumper \%fichero1;
funcion(\%fichero1,\%fichero2);
print "\n---------------\n";
print Dumper \%fichero1;
print Dumper \%fichero1_copia;
funcion(\%fichero1_copia,\%fichero2);
Esta segunda opción pretendía que el segundo Dumper saliera vacío y el tercero lleno... pero en su lugar obtengo esto:
Código:
$VAR1 = {
'c3' => [
[
50,
52,
'CO',
'+'
]
],
'c1' => [
[
20,
22,
'COL',
'+'
],
[
10,
12,
'COL',
'+'
],
[
30,
32,
'COL',
'+'
],
[
80,
82,
'COL',
'+'
],
[
90,
92,
'COL',
'+'
]
],
'c2' => [
[
40,
42,
'COM',
'+'
],
[
210,
32,
'COM',
'+'
]
]
};
---------------
$VAR1 = {};
$VAR1 = {
'c3' => [
[
50,
52,
'CO',
'+'
]
],
'c1' => [
[
90,
92,
'COL',
'+'
]
],
'c2' => [
[
210,
32,
'COM',
'+'
]
]
};
No entiendo por qué %fichero1_copia no tiene todos los elementos originales. Y si es que los
hashs nunca hacen copia, sino que se duplican por referencia (lo que no me sirve), ¿por qué tiene sólo los elementos finales del hash original, en lugar de estar vacío, como el
hash original tras ejecutar la función? Es como si los shift() hubieran tenido efecto pero los delete() de las
keys no.
En fin... un mar de dudas, espero no haber complicado demasiado mi cuestión. Para simplificar, mi pregunta principal es "cómo duplicar un hash con todo su contenido para trabajar con original y copia de manera independiente".
Un saludo.