• Publicidad

Mandar variables por una función

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

Mandar variables por una función

Notapor BigBear » 2010-10-20 13:32 @605

Hola, tengo un problema con el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @eee = ("c","c");
  2. $normal = "hola";
  3.  
  4. mandar(@eee,$normal);
  5.  
  6.  
  7. sub mandar {
  8.     print $_[0];
  9.     print $_[1];
  10. }
  11. <STDIN>;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Me debería mostrar las dos variables pero no me la muestra. ¿Por qué existe ese
problema cuando se mezcla con un array? Y, ¿cómo lo arreglo?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Mandar variables por una función

Notapor explorer » 2010-10-20 15:07 @671

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my @array = qw( c d );
  7.  
  8. my $normal = 'hola';
  9.  
  10. mandar(@array, $normal);   # cd
  11.  
  12. print "\n";
  13.  
  14.  
  15. sub mandar {
  16.     print $_[0];
  17.     print $_[1];
  18. }
  19.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Perl despliega los array casi cada vez que se lo encuentra en el código. Por eso, cuando pones

mandar(@array, $normal)

es como si pusieras

mandar( ('c', 'd') , $normal)

Y como los paréntesis, casi siempre están de adorno, al final tenemos

mandar( 'c', 'd', $normal)

El valor de $normal estará en $_[2], porque son tres los argumentos que le pasaste a la función.

Cosa distinta hubiera pasado si lo hubieras llamado así:

mandar($normal, @array)

Una forma mejor de enviar un array a una función, es por referencia (como se suele hacer en el lenguaje C):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my @array = qw( c d );
  7.  
  8. my $normal = 'hola';
  9.  
  10. mandar(\@array, $normal);   # c d hola
  11.  
  12. sub mandar {
  13.     my($array_ref, $normal) = @_;
  14.     print "@{$array_ref} $normal\n";
  15. #   print $array_ref->[1], "\n";      # d
  16. }
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

Re: Mandar variables por una función

Notapor danimera » 2010-10-22 00:46 @074

El cómo lo arreglas solo es agregar el otro índice.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @eee = ("c","c");
  2. $normal = "hola";
  3.  
  4. mandar(@eee,$normal);
  5.  
  6.  
  7. sub mandar {
  8.     print $_[0];
  9.     print $_[1];
  10.     print $_[2]; # valor de $normal
  11. }
  12. <STDIN>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Mandar variables por una función

Notapor explorer » 2010-10-22 03:34 @190

Esa es una mala solución... ¿qué pasará si el array crece en número de elementos? Pues tenemos que acordarnos de cambiar este código una y otra vez.

Lo mejor es pasarlo por referencia. O... si estamos de acuerdo que el último argumento es $normal, sería mejor ponerlo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub mandar {
    my @array = @_[0 .. $#@_-1];
    print "@array\n";            # valores del array
    print "$_[-1]\n";            # valor de $normal
}
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

Re: Mandar variables por una función

Notapor danimera » 2010-10-22 09:46 @449

Hummm... yo no entiendo mucho eso, si estamos en un foro básico...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub mandar {
    my @array = @_;
    print Dumper  "@array\n";            # valores del array
       
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Así ya se tienen los datos, pero igual toca otra forma para leerlos, quizás comparando el tipo en un ciclo éé...
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Básico

¿Quién está conectado?

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