Lurky escribiste:estoy intentando guardar ciertos datos en muchos arrays, guardados a su vez en un hash.
Más tarde accedería a esos arrays mediante un bucle y usando las keys del hash. Y promediaría la suma de ciertas combinaciones de esos arrays en otros arrays hasta que se incumplan ciertas condiciones.
Los arrays que sí cumpliesen esas condiciones irían a parar al mismo hash, pero sobreescrito. Tras lo cual, yo trabajaría con esos datos.
¿Me he complicado mucho la vida? ¿Esto sería muy costoso en términos de memoria?
No creo que te la hayas complicado... las estructuras en Perl, de
hash de
arrays, son muy comunes.
Lo interesante es saber si es la más óptima o no. Pero eso lo dicta la experiencia.
En cuanto a la memoria, sería costoso si tuvieras que ir a la tienda a comprar más memoria. Mientras uses la que tienes, todo perfecto.
Mejor dicho sería: ¿Sería óptimo el almacenamiento en memoria? Y la respuesta sería que depende del resto de programas del sistema: si les desplazas a la memoria de intercambio, entonces sí que sería costoso en términos de consumo de recursos.
Pero bueno, estamos hablando de varios centenares de millones de datos...
Lurky escribiste:1/ En el código que acabas de enseñarme, $array->[$i] qué quiere decir exactamente?
$array es una variable escalar que almacena una referencia. Una referencia a otra cosa. En este caso, vemos unos corchetes, así que está referenciando a un
array. Con el signo '->' lo desreferenciamos (igual que hacemos en lenguaje C) y accedemos al
array del que nos quedamos el elemento
$i-eximo.
Una referencia en Perl es como un
puntero en otros lenguajes, pero... más "virtual".
Lurky escribiste:2/Para operar con esos
arrays, los introduciré en un
array que los englobe, como me dijiste antes. Para extraerlos del
hash en el que están, lo único que se me ocurre es esto:
Using perl Syntax Highlighting
my (@secundario) = ( [%hash {$tal}], .., [%hash {$cual}]);Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Me falla, entre otras cosas, creo que el ".." está mal usado.
Aunque Perl es muy liberal, eso no quiere decir que podamos programar con el método de "ensayo y error". Hay que seguir las normas del lenguaje.
1. Has escrito
%hash{$tal}, cuando, seguramente, quieres decir
$hash{$tal}. El "sigil" o carácter que precede a las variables indica el tipo de dato que vamos a obtener de ellas. Si, de un hash (
%hash) queremos obtener uno de sus valores (el correspondiente a la clave
$tal) entonces es que vamos a recuperar un escalar (un valor), así que por eso ponemos un
$ delante de la variable.
2. El operador '..' se usa para rangos de números o como operador de condiciones, pero para nada más... Perl no es tan listo como para saber qué quieres decir, o qué valores van del
$tal al
$cual. Si quieres sacar todos los valores de un
hash, te vale con usar la función values():
Using perl Syntax Highlighting
my @secundario = values %hash;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Si no son todos los valores, entonces hay que trabajar algo más. Si, por ejemplo, quieres los valores dentro de un rango numérico, entonces puedes usar un
slice:
Using perl Syntax Highlighting
my @secundario = @hash{$tal .. $cual};Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
. Y si, finalmente, son valores no consecutivos, entonces hay que indicarles todos, en el
slice:
Using perl Syntax Highlighting
my @secundario = @hash{$tal, $cual, $fulano, $mengano, $zutano};Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Observa como, ahora, en estos dos últimos ejemplos, he puesto una
@ delante de la variable: es porque voy a recuperar más de un elemento. O dicho de otra manera: voy a recuperar una "lista" de valores.
Lurky escribiste:3/ En un bucle, mi idea es usar esto:
Using perl Syntax Highlighting
%datossecundarios = (%datossecundarios, $ventanaorigen, @secundario);Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
¿Funcionará? (probablemente no, conociéndome) ¿O cuál sería la alternativa correcta?
No, no funcionará. No sé lo que quieres hacer, pero viendo lo escrito la respuesta es no.
Recuerda:
use warnings; es tu amigo.