• Publicidad

Arreglo como parámetro

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Arreglo como parámetro

Notapor Lor » 2007-09-18 07:30 @354

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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 hidden(-name=>'array_materiales', -default=>@array_materiales)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El SCRIPT que recibe:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  import_names('Q');
  my @array_materiales = $Q::array_materiales || "";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Muchísimas gracias. :D
Lor
Perlero nuevo
Perlero nuevo
 
Mensajes: 187
Registrado: 2005-04-28 05:47 @282

Publicidad

Notapor explorer » 2007-09-18 09:52 @452

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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, );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-09-18 10:07 @463

Este ejemplo muestra mejor la forma de recuperar los datos del array:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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";
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Lor » 2007-09-18 10:26 @476

Explorer,

¡¡¡¡ MUCHAS GRACIAS !!!!! POR TU TIEMPO Y DEDICACIÓN.
Lor
Perlero nuevo
Perlero nuevo
 
Mensajes: 187
Registrado: 2005-04-28 05:47 @282

Notapor Lor » 2007-09-18 11:03 @502

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.
Lor
Perlero nuevo
Perlero nuevo
 
Mensajes: 187
Registrado: 2005-04-28 05:47 @282

Notapor explorer » 2007-09-18 12:21 @556

¿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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Usas CGI.pm, ¿verdad?

Notapor Jenda » 2007-10-29 14:13 @634

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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
hidden(-name=>'array_materiales', -default=>@array_materiales)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

debe ser
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
hidden(-name=>'array_materiales', -default=>\@array_materiales)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


( ¡Fíjate en el \! )

Aquí hay otro problema:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @array_materiales = $Q::array_materiales || "";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


$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!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @array_materiales = @Q::array_materiales;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados