• Publicidad

Duda básica funciones

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Duda básica funciones

Notapor ricar » 2009-11-05 05:52 @286

Hola.

Tengo una duda/problema.

Si en una función retornas varios parámetros, tipo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
return (@var1, @var2, @var3);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Se supone que al hacer la llamada, cada variable es guardada, en orden, sobre otra variable. Me explico:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
(@otraVar1, @otraVar2, @otraVar3) =  &miFuncion();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Se supone que en @otraVar1, estarán los datos correspondientes a @var1, en @otraVar2 los de @var2 y así sucesivamente.

El caso es que lo estoy haciendo y en @otraVar1 obtengo los datos de @var1, @var2 y @var3 y el @otraVar2 y @otraVar3, no tengo nada.

¿Qué estoy haciendo mal?

Muchas gracias.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Publicidad

Re: Duda básica funciones

Notapor Jenda » 2009-11-05 06:44 @322

Es que las funciones devuelven sólo una lista de escalares cuando son ejecutadas en contexto lista o un sólo escalar cuando son ejecutadas en contexto escalar En el primer caso no importa si los escalares vienen de algunos arrays, variables escalares, funciones, ... es sólo una lista aplastada.

No hay posibilidad de distinguir

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub foo {
  return (1,2,3,4,5)
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


de

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub foo {
  my @a = (1,2);
  my @b = (3,4,5);
  return @a, @b
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡Las dos funciones devuelven exactamente lo mismo en contexto lista! En contexto escalar devuelven números diferentes, pero seguramente no los dos arrays.

Después lo único que puede pasar es que todos los elementos acaban en el primer array y los otros quedan vacíos.

Cada vez que asignas a una lista de variables, el primer array devora todo el resto de la lista en el derecho y el resto de las variables quedan vacías.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my ($a,@b,$c) = (1,2,3); # $a = 1; @b = (2,3); $c = undef;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Re: Duda básica funciones

Notapor ricar » 2009-11-05 07:53 @370

A ver si te he entendido bien.

¿Lo que quieres decir es que pases lo que pases sólo lo volcará en una única variable? ¿No se puede disgregar en varias variables?

Yo utilizo la segunda forma, o sea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        my @var1 = (1,2,3);
        my @var2 = ("A","B","C", "D", "E");
        return (@var1, @var2);
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ambos valores los quiero volcar en dos arrays diferentes, puesto que no tienen nada que ver.

Si lo vuelco todo a un único array, tendría que pasar también el tamaño de los arrays para poder separarlo en dos arrays.

No sé si hay alguna forma de hacer lo que quiero.

Muchas gracias.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Duda básica funciones

Notapor explorer » 2009-11-05 08:09 @381

El paso de parámetros a una función siempre es una lista de escalares.

Lo que pasa es que cuando ponemos

funcion(@array1, @array2, @array3);

Perl realiza un "despliegue" de todos los elementos de todos los arreglos y los manda como un conjunto de elementos, al @_ de la funcion(). Y entonces no sabes qué elementos corresponden a qué array.

La solución es la misma que en lenguaje C (y en otros muchos lenguajes): pasar la "referencia" de los array:

funcion(\@array1, \@array2, \@array3);

Ahora la funcion() recibe 3 valores: las referencias a los 3 arreglos.

Dentro de la funcion(), podremos ahora referirnos al contenido de cada uno de ellos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub funcion() {
    my $array1_ref = $_[0];
    my $array2_ref = $_[1];
    my $array2_ref = $_[2];

    print "Elemento segundo del tercer arreglo: ", $array3_ref->[1], "\n";

    # Podemos modificar los elementos de los arreglos originales:
    $array1_ref->[2] = 12;

    # Otra forma de acceso: copiar los elementos de los arreglos a arreglos privados
    my @array1 = @{$array1_ref};
    print "Primer elemento del primer arreglo: $array1[0], "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


A la hora de devolver los resultados, se puede seguir la misma estrategia:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub funcion_que_devuelve_dos_arreglos () {
    my @arreglo1 = (1 .. 10);
    my @arreglo2 = ('a' .. 'f');
    return \@arreglo1, \@arreglo2;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En la llamada a la función, solo tenemos que acordarnos que lo que recibimos son referencias, así que hay que leerlas de forma especial:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my ($array1_ref, $array2_ref) = funcion_que_devuelve_dos_arreglos();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y luego podemos acceder directamente a sus contenidos (como se ha visto en la funcion() anterior) o sacar una copia en otro arreglo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @arreglo1 = @{$array1_ref};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Duda básica funciones

Notapor ricar » 2009-11-05 08:30 @396

Gracias explorer.

Ahora mismo iba a enviar una respuesta-solución al foro porque acabo de encontrar la solución.

Eso sí, la explicación no iba a ser tan "ilustrosa" como la tuya :D

Gracias por todo.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados