
Mar Sep 18, 2007 8:52 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4100
Ubicación: Valladolid, España
|
|
|
|
|
| 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. |
|

Mar Sep 18, 2007 9:07 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4100
Ubicación: Valladolid, España
|
|
|
|
|
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"; |
|
|
Mar Sep 18, 2007 9:26 am
|
 |
Lor
Perlero Nuevo

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

|
Registrado: 28 Abr 2005
Mensajes: 99
Ubicación: Argentina, Santa FE
|
|
|
|
|
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. |
|
Mar Sep 18, 2007 11:21 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4100
Ubicación: Valladolid, España
|
|
|
|
|
¿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. |
|

Lun Oct 29, 2007 1:13 pm
|
 |
Jenda
Perlero Frecuente

|
Registrado: 29 Oct 2007
Mensajes: 105
Ubicación: Praga, Republica Checa
|
|
| Usas CGI.pm, ¿verdad? |
|
|
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; |
|
|
Powered by phpBB © 2001, 2005 phpBB Group
|