@ y []
Salvador Ortiz Garcia
sog@msg.com.mx
Tue, 3 Mar 1998 15:55:17 -0600 (CST)
On Tue, 3 Mar 1998, Julian Romero wrote:
> Tengo el siguiente problema: ($a y $b están definidos)
>
> #modo 1 (OK)
> @lista = [ $a => $b ];
> mi_func( -add => @lista );
>
> #modo 2 (Falla)
> push @lista, $a, $b;
> mi_func( -add => @lista );
>
> Algún amable conocedor de este fantástico lenguaje (fase de peloteo)
> puede explicarme la diferencia entre estos dos modos de construir la
> lista. Me vale con la página del manual que lo explique.
A falta de saber que hace tu_func, te puedo decir que estas haciendo con
cada expresión, vamos por partes:
Supongo que @lista está vacia al inicio.
En:
@lista = [ $a => $b ];
Creas una lista sin nombre con dos elementos: $a y $b; de la que generas
una referencia con '[' (man perlref) (referencia a un arreglo anónimo) que
finalmente asignas al primer elemento del arreglo @lista.
Por lo anterir @lista NO TIENE dos elementos, tiene UNO.
Lo anterior es exactamente igual a:
$lista[0] = [ $a , $b ];
En:
mi_func( -add => @lista );
suponiendo que la declaración de mi_func no tiene prototipos, se
interpreta como:
mi_func ( '-add' , @lista );
Luego, por interpolación de sublistas en listas (man perldata),
@lista se expande, pero tiene sólo un elemento (la referencia a la arreglo
anónima) por lo que mi_func recibe DOS parametos: '-add' y una referencia.
Qué hace mi_func con la referencia?, no sé, pero supongo que lo que
tu esperas.
El otro caso:
push @lista, $a , $b;
Si @lista está vacia, es idéntico a:
@lista = ($a , $b);
Es decir, creas un arreglo @lista con DOS elementos que en
mi_func( -add => @lista);
hace que mi_func reciba TRES parametros: '-add', $a y $b.
Que en tu caso hace que mi_func no haga lo que _tu_ esperas.
Evidentemente, no es lo mismo crear listas con '(' y ')' que referencias a
arreglos anónimos con '[' y ']'.
Saludos.
Salvador Ortiz.