• Publicidad

Problema al mostrar array

¿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 mostrar array

Notapor BigBear » 2011-05-18 12:45 @573

Hola, ando teniendo una duda básica al querer mostrar un array, el
problema es que tengo una función que retorna un array con números del 1 al 9,
cuando llamo la función para poder retornar el resultado, el script me
devuelve solo la longitud del array cuando quiero mostrarlo completo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @re = mandar();     
  2.  
  3. print "tengo ".@re."\n";
  4.  
  5. sub mandar {
  6. my @a = (1..9);
  7. return @a;
  8. }
  9.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿ Alguien me podría explicar por qué pasa esto ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Problema al mostrar array

Notapor explorer » 2011-05-18 12:51 @577

Lo que ocurre es que dentro del print(), estás colocando el array @re en contexto escalar, por acción del operador '.'. Es decir, lo que obtenemos de @re es el número de elementos de @re; en este caso, un '9'.

Lo que puedes hacer es colocar el array @re dentro de las comillas dobles, para hacer una interpolación automática al contenido de @re (todos los elementos de @re separados por el delimitador indicado por la variable especial $"):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "tengo @re\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Otra opción es colocarlo sin interpolación:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "tengo ", @re, "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero el resultado, será distinto (aparecen los elementos, pero sin el separador).
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: Problema al mostrar array

Notapor BigBear » 2011-05-18 13:03 @585

Gracias por la ayuda explorer, pero tengo otra duda: necesito el resultado de la función en una variable llamada $re pero me devuelve también la longitud. Perdón si ya me lo dijiste pero es que no entiendo del todo.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Problema al mostrar array

Notapor explorer » 2011-05-18 13:10 @590

Si lo que quieres es obtener un escalar, entonces es correcto usar una variable escalar.

Si lo que quieres es obtener una estructura más compleja, entonces lo que debes guardar en el escalar es una referencia a esa estructura.

Recuerda que en una variable escalar solo se puede almacenar un valor.

Si muestras algo de código, o si nos cuentas qué es realmente lo que quieres hacer, pues te podremos ayudar más.
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: Problema al mostrar array

Notapor BigBear » 2011-05-18 13:29 @603

Gracias por la ayuda, ya resolví el problema, pongo el código de la
función que estaba haciendo , también hice una versión tk.

Versión consola

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2. #Function genpass() By Doddy H
  3.  
  4. my @password = genpass(8);
  5.  
  6. print "pass : ",@password,"\n";
  7.  
  8. sub genpass {
  9.  
  10. my $length = shift;
  11.  
  12. my @re;
  13.  
  14. my @mayus = (A..Z);
  15. my @minus = (a..z);
  16. my @number = (0..9);
  17. my @op = (1..3);
  18.  
  19. for (1..$length) {
  20.  
  21. my $opt = @op[rand(@op)];
  22. if ($opt eq 1) {
  23. push(@re,@mayus[rand(@mayus)]);
  24. }
  25. elsif ($opt eq 2) {
  26. push(@re,@minus[rand(@minus)]);
  27. }
  28. elsif ($opt eq 3) {
  29. push(@re,@number[rand(@number)]);
  30. }
  31. }
  32. return @re;
  33. }
  34.  
  35. #Thanks to explorer (perlenspanol)
  36.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Versión gráfica

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2. #Gen Password (C) Doddy Hackman 2011
  3.  
  4. use Tk;
  5.  
  6. if ($^O eq 'MSWin32') {
  7. use Win32::Console;
  8. Win32::Console::Free();
  9. }
  10.  
  11. my $sin = MainWindow->new();
  12. $sin->title("Gen Password (C) Doddy Hackman 2011");
  13. $sin->geometry("530x80+20+20");
  14. $sin->resizable(0,0);
  15.  
  16. $sin->Label(-text=>"Result : ",-font=>"Impact1")->place(-x=>30,-y=>20);
  17. my $rex = $sin->Text(-width=>28,-height=>1)->place(-y=>24,-x=>90);
  18. $sin->Label(-text=>"Length : ",-font=>"Impact1")->place(-x=>310,-y=>20);
  19. my $leng = $sin->Entry(-width=>3,-text=>3)->place(-y=>24,-x=>370);
  20. $sin->Button(-text=>"Generate",-command=>\&gen,-width=>12)->place(-y=>22,-x=>410);
  21.  
  22. MainLoop;
  23.  
  24.  
  25. sub gen {
  26.  
  27. $rex->delete("0.0","end");
  28. my $ala = $leng->get;
  29.  
  30. my @password = genpass($ala);
  31. for $pass(@password) {
  32. $rex->insert("end",$pass);
  33. }}
  34.  
  35. sub genpass {
  36.  
  37. my $length = shift;
  38.  
  39. my @re;
  40.  
  41. my @mayus = (A..Z);
  42. my @minus = (a..z);
  43. my @number = (0..9);
  44. my @op = (1..3);
  45.  
  46. for (1..$length) {
  47.  
  48. my $opt = @op[rand(@op)];
  49. if ($opt eq 1) {
  50. push(@re,@mayus[rand(@mayus)]);
  51. }
  52. elsif ($opt eq 2) {
  53. push(@re,@minus[rand(@minus)]);
  54. }
  55. elsif ($opt eq 3) {
  56. push(@re,@number[rand(@number)]);
  57. }
  58. }
  59. return @re;
  60. }
  61.  
  62. #Thanks to explorer (perlenespanol)
  63. # ¿ The End ?
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Cualquier sugerencia, decidla.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Problema al mostrar array

Notapor explorer » 2011-05-18 13:42 @613

Esta es mi versión (no probada):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub genpass {
  2.     my $length = shift;
  3.  
  4.     my @seed = ('a'..'z','A'..'Z',0..9);
  5.  
  6.     return join '', map { $seed[rand @seed] } 1 .. $length;
  7. }
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


Volver a Básico

¿Quién está conectado?

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