• Publicidad

Problema al pasar como párametro de una función una lista

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

Problema al pasar como párametro de una función una lista

Notapor miguialberto » 2008-09-18 08:06 @379

Hola.

A ver si me podéis ayudar con un problema que llevo atascado un rato y no sé cómo solucionarlo. El código que tengo es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @list1;

push(@list1,"a");
push(@list1,"c");

b(@list1);

sub b(){

        my @list2 = $_[0];
        print @list2;
        print "\n";
        print "Number of elements = ".scalar(@list2);
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La salida de este programa es:
Código: Seleccionar todo
a
Number of elements = 1


Lo que yo quiero es no perder el segundo componente de la lista al pasarlo como parámetro de la función "b". Es decir, quiero que la salida sea:

Código: Seleccionar todo
ac
Number of elements = 2


¡¡Gracias de nuevo por la ayuda!!
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301

Publicidad

Notapor monoswim » 2008-09-18 08:38 @401

$_[0] ese es solamente el primer elemento del array... o sea la 'a'.

Deberías de colocar

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @list2 = @_;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahí te saldrá 'ac' ;-)

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor miguialberto » 2008-09-18 09:09 @422

¡Muchas gracias, monoswim por la rapidez!

Por desgracia sigo teniendo el problema porque el ejemplo que he puesto está "minimizado". En mi caso real estoy llamando a una función con más parámetros, y en este caso no me funciona esta solución. Un ejemplo sería:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @list1;
my $val1;

push(@list1,"a");
push(@list1,"c");

$val1 = "e";

b(@list1, $val1);

sub b(){

        my @list2 = @_;
        my $val2 = $_[1]; #?

        print "@list2\n";
        print "$val2\n";;
        print "Number of elements = ".scalar(@list2);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La salida de esto es:

Código: Seleccionar todo
a c e
c
Number of elements = 3


El problema es que me gustaría saber cómo puedo pasar por parámetro una lista, como si fuera una variable normal, y que luego la pueda leer en otra lista sin problemas. ¿No existe ningún modo?

¡Gracias de nuevo!
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301

Notapor explorer » 2008-09-18 12:03 @543

Mira los comentarios...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @list1;
my $val1;

push(@list1,"a");
push(@list1,"c");

$val1 = "e";

b($val1, @list1);           # No son dos parámetros... el array se "despliega"

sub b(){
        my $val2  = shift;  # Leemos el primer valor escalar
        my @list2 = @_;     # Leemos el resto de los valores

        print "@list2\n";
        print "$val2\n";;
        print "Number of elements = ".scalar(@list2);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Una opción a lo que quieres: pasar el array como una referencia.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @lista;
my $valor;

push @lista, 'a', 'c';
$valor     = 'e';

b($valor, \@lista);         # Pasamos dos parámetros, dos escalares.
                            # El segundo es una referencia al array.

sub b {
    my ($valor, $lista_ref) = @_;

    print @$lista_ref, "\n";
    print $valor,      "\n";
    print "Number of elements = ", scalar @$lista_ref, "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esa manera, podrás acceder a los elementos del array dentro de la subrutina. Por ejemplo, $lista_ref->[1] accede al segundo elemento del array.

Ahora bien, si la subrutina la construimos de tal forma que el array siempre está al final de la lista de parámetros, podemos simplificarlo un poco...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @lista;
my $valor;

push @lista, 'a', 'c';
$valor     = 'e';

b($valor, @lista);          # Pasamos dos parámetros.

sub b {
    my ($valor, @lista) = @_;

    print @lista, "\n";
    print $valor, "\n";
    print "Number of elements = ", scalar @lista, "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y el acceso a los elementos del array dentro de la subrutina es: $lista[1], por ejemplo.
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 miguialberto » 2008-09-19 02:23 @141

¡Muchas gracias de nuevo explorer!

Creo que me quedo con la solución de pasar por referencia. Las otras soluciones las veo demasiado particulares y no me gusta que la solución dependa de en qué posición tienen que pasarse los parámetros.

¡Gracias de nuevo!
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301


Volver a Básico

¿Quién está conectado?

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