Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Arreglo como parámetro

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto
Mensaje Mar Sep 18, 2007 6:30 am
Lor
Perlero Nuevo
Perlero Nuevo
Registrado: 28 Abr 2005
Mensajes: 99
Ubicación: Argentina, Santa FE
Arreglo como parámetro Responder citando

Agradecería si me pudiesen indicar cómo leo los datos de un arreglo que ha sido pasado como parámetro.

Es decir, mi script recibe un parámetro que es un arreglo de elementos y quiero leer sus datos.

El SCRIPT que envía el arreglo tengo:

Perl:
hidden(-name=>'array_materiales', -default=>@array_materiales)


El SCRIPT que recibe:

Perl:
  import_names('Q');
  my @array_materiales = $Q::array_materiales || "";



Muchísimas gracias. Very Happy
Mensaje Mar Sep 18, 2007 8:52 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4100
Ubicación: Valladolid, España
Responder citando

Perl:
#!/usr/bin/perl -l
use strict;
use warnings;

package Q;

sub hidden {

#    print join "\n", @_;

    while ( $_ = shift ) {

        if ( /^-/ ) {

            my $parametro = $_;

            my $valor = ( $parametro eq '-default' ) ? join(q{,},@_) : sh

            print "$parametro : $valor";
        }

    }
}

package main;

my @array_materiales = qw(pincho tornillo tuerca);

Q::hidden(-name => 'array_materiales', -default => @array_materiales, );
Al pasar un array, Perl lo 'despliega', por lo que la función recibe todos los elementos del array como si hubiesen sido pasados uno a uno.

Es un poco peligroso porque podríamos mezclar los elementos del array con otros elementos que le estemos pasando a la función, como los del ejemplo, que tienes '-name' y '-default'.

En este caso se puede hacer porque has colocado el array como ÚLTIMO valor a pasar a la función. Perl 'despliega' todos los valores en esa posición, por lo que la función hidden asume que no hay más posibles parámetros después, sino que el parámetro '-default' marca el inicio de la lista de valores de un array. Por eso he puesto un join de todos los valores restantes.

Como ves, es cómodo pasar un array, pero peligroso porque tenemos que acordarnos que después de él no podemos indicar ningún argumento más. Tenemos que ponerlo siempre el último de todos los parámetros pasados a la función.

Sería mejor sustituir el paso de un array 'desplegado' por el de una referencia a él. Así pasas solo un argumento (más rápido) y es independiente de la posición dentro de la lista de argumentos.
Mensaje Mar Sep 18, 2007 9:07 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4100
Ubicación: Valladolid, España
Responder citando

Este ejemplo muestra mejor la forma de recuperar los datos del array:
Perl:
#!/usr/bin/perl -l
use strict;
use warnings;

package Q;

use vars '@array_materiales';

sub hidden {

    my $valor;

    while ( my $parametro = shift ) {

        if ( $parametro eq '-default' ) {

            @array_materiales = @_;
            undef @_;

            $valor = join q{,}, @array_materiales;
        }
        else {

            $valor = shift;
        }

#        print "$parametro : $valor";

    }
}

package main;

my @material = qw(pincho tornillo tuerca);

Q::hidden(-name => 'array_materiales', -default => @material );

my @array_materiales = @Q::array_materiales;
print "@array_materiales";
Mensaje Mar Sep 18, 2007 9:26 am
Lor
Perlero Nuevo
Perlero Nuevo
Registrado: 28 Abr 2005
Mensajes: 99
Ubicación: Argentina, Santa FE
Responder citando

Explorer,

¡¡¡¡ MUCHAS GRACIAS !!!!! POR TU TIEMPO Y DEDICACIÓN.
Mensaje Mar Sep 18, 2007 10:03 am
Lor
Perlero Nuevo
Perlero Nuevo
Registrado: 28 Abr 2005
Mensajes: 99
Ubicación: Argentina, Santa FE
Responder citando

Explorer, hay un problema de interpretación en tu respuesta, debido a que yo me exprese mal.

El pasaje de parámetros NO ES a una función, sino que es un FORM, que llama a otro pl, pasándonle parámetros a través de un método POST o GET.

Y no logro poder leer ese arreglo recibido.

Gracias.
Mensaje Mar Sep 18, 2007 11:21 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4100
Ubicación: Valladolid, España
Responder citando

¿Que un formulario pasa un array a un cgi?

Deberás 'serializar' ese array para que se pueda enviar por el protocolo GET o POST.

Una posibilidad sería convertirlo a formato JSON, aunque quizás sea tan fácil como hacer un 'join' de los elementos con un carácter único, como por ejemplo '|' y pasar todo como una cadena de caracteres al cgi.
Mensaje Lun Oct 29, 2007 1:13 pm
Jenda
Perlero Frecuente
Perlero Frecuente
Registrado: 29 Oct 2007
Mensajes: 105
Ubicación: Praga, Republica Checa
Usas CGI.pm, ¿verdad? Responder citando

Ese script usa CGI.pm, ¿verdad? Hay dos problemas en tu código.

Perl:
hidden(-name=>'array_materiales', -default=>@array_materiales)

debe ser
Perl:
hidden(-name=>'array_materiales', -default=>\@array_materiales)


( ¡Fíjate en el \! )

Aquí hay otro problema:
Perl:
my @array_materiales = $Q::array_materiales || "";


$Q::array_materiales solo contiene el primer elemento de @array_materiales; si los quieres todos tienes que usar @Q::array_materiales, pero sin el ' || "" ' !Si lo usas, vas a obtener el número de materiales porque el || causa un contexto escalar al array y los arrays en un contexto escalar retornan su longitud!

Perl:
my @array_materiales = @Q::array_materiales;
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group