@ 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.