• Publicidad

Error en salto de línea

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

Error en salto de línea

Notapor Mono_Ezpacial » 2012-11-10 11:33 @523

¿Hola? ¿qué tal?
Ya casi acabo mi programa, pero tengo un problema más. Ok, miren ustedes mi código, ya les digo cuál es el error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. system("clear");
  3. use Term::ANSIColor;
  4. system("clear");
  5. print "\n";
  6. my $jaca = 0;
  7. my @animadd;
  8. my @coment;
  9. do {
  10.     print "Animals > ";
  11.     $animals__ = "--animals";
  12.     $exit      = "exit";
  13.     $add_an    = "add ani";
  14.     chomp( $usr = <> );
  15.     if ( $usr eq $animals__ ) {
  16.         system("clear");
  17.         print "\n\nTotal de animales: ", color("green"), scalar(@animadd), "\n", color("reset");
  18.         print color("cyan"), q{
  19. Animales agregados  
  20. ============================
  21.  
  22.         Nombre del animal                       Descripción
  23.   ----------------------                      ----------------
  24.         }, color("reset");
  25.         use Term::ANSIColor;
  26.         for my $add_an_z (@animadd) {
  27.             print "\n";
  28.             print "\t$add_an_z";
  29.         }
  30.         print "\t$add_an_z[1]";
  31.         for my $coment_an_z (@coment) {
  32.             print "\t\t$coment_an_z\n";
  33.         }
  34.         print "\n\t\t\t\t$coment_an_z[1]\n";
  35.     }
  36.     elsif ( $usr eq $exit ) {
  37.         exit(0);
  38.     }
  39.  
  40.     elsif ( $usr eq $add_an ) {
  41.         my $add_an_x;
  42.         my $coment_an_x;
  43.  
  44.         print color("blue"), "\t [*]", color("reset"), "Introduce un animal: ";
  45.         chomp( $add_y_x = <> );
  46.         push @animadd, $add_y_x;
  47.         print color("blue"), "\t [*]", color("reset"), "Agregar descripcion: ";
  48.         chomp( $coment_y_x = <> );
  49.         push @coment, $coment_y_x;
  50.         if ( scalar(@animadd) eq '1' ) {
  51.             print color("green"), "\t [+]", color("reset"), "EL animal fue añadido correctamente\n";
  52.         }
  53.         else {
  54.             print color("green"), "\t [+]", color("reset"), "EL animal fue añadido correctamente\n";
  55.         }
  56.     }
  57.     else {
  58.         print "Unknown command = $usr\n";
  59.     }
  60. } until $jaca;
  61.  
  62.  
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


Ok, si quieren prueben el código.
Bueno, se preguntarán qué hace esto. Pues bien, esto hace:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Animals > add ani            # Ok, ustedes escriben "add ani" y les saldrá una opción para agregar un animal y una pequeña descripción
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Ahora escribimos
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
--animals
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


para ver los animales agregados, Ok, no hay problema, te los muestra, pero ahora agrega otro animal, con el mismo procedimiento
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Animals > add ani
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Todo va de maravilla, Ok, pero ahora intenta ver los animales agregados de nuevo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
--animals
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y verán que las líneas se corren, no sé, es como un salto de línea creo yo, cuando lo hagan se darán cuenta, ya lo intenté modificándolo muchas veces, de lo contrario no pediría ayuda, sé que debe ser algo sencillo pero no veo la forma de reparar ese error.

Gracias y ¡un saludo!
Wake up, Neo... The Matrix has you... Follow the white rabbit. Knock, Knock, Neo.
Mono_Ezpacial
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-09-23 18:09 @798

Publicidad

Re: Error en salto de línea

Notapor explorer » 2012-11-10 12:20 @555

El problema está en que debes imprimir un animal y su comentario, a la vez, para que salgan en la misma línea.

Sustituye las líneas 24 a 34 por estas otras:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. }, color("reset");
  2.         for my $i (0 .. $#animadd) {
  3.             print "\t\t$animadd[$i]\t\t$coment[$i]\n";
  4.         }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Observa que he quitado los espacios en blanco de la línea 24.

Lo que hacemos es recorrer los índices del array @animadd, con la variable $i. Y como suponemos que deben coincidir los elementos entre los dos arrays, pues usamos ese índice para sacar los elementos de cada array, por parejas.

Los índices de un array van desde el 0 hasta el valor del último índice posible, que obtenemos poniendo el sigilo '$#'. Así, yendo de 0 a $#animadd estamos recorriendo todos los índices.
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: Error en salto de línea

Notapor Mono_Ezpacial » 2012-11-10 12:44 @572

¡Wow! Gracias, explorer. ¡Una vez más me salvaste! ¡un saludo, bro!
Wake up, Neo... The Matrix has you... Follow the white rabbit. Knock, Knock, Neo.
Mono_Ezpacial
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-09-23 18:09 @798

Re: Error en salto de línea

Notapor explorer » 2012-11-10 14:23 @641

Esta es mi versión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.10;
  3. use Term::Menu;
  4. use Term::ANSIColor ':constants';
  5. $Term::ANSIColor::AUTORESET = 1;
  6.  
  7. system("clear");
  8.  
  9. my @animales;
  10. my $respuesta;
  11. my $menu = Term::Menu->new(
  12.                 beforetext      => "\nEscriba una opción.",
  13.                 aftertext       => 'Animals > ',
  14. );
  15.  
  16. do {
  17.     $respuesta = $menu->menu(
  18.                     add => [ 'Añadir animal',   'a' ],
  19.                     list=> [ 'Listar animales', 'l' ],
  20.                     cls => [ 'Borrar pantalla', 'c' ],
  21.                     exit=> [ 'Salir',           '0' ],
  22.     );
  23.  
  24.     if ($respuesta eq 'list') {
  25.         system("clear");
  26.         say "\n\nTotal de animales: ", GREEN scalar(@animales);
  27.         say CYAN "\tAnimales agregados";
  28.         say CYAN "\t======================";
  29.         say CYAN "\tNombre del animal      Descripción";
  30.         say CYAN "\t-------------------    --------------";
  31.  
  32.         for my $i (0 .. $#animales) {
  33.             printf "\t%-19s    %s\n", $animales[$i][0], $animales[$i][1];
  34.         }
  35.     }
  36.     if ($respuesta eq 'add') {
  37.         print BLUE "\t [*] ", RESET, 'Introduce un animal: ';
  38.         chomp(my $nuevo = <>);
  39.         print BLUE "\t [*] ", RESET, 'Agregar descripción: ';
  40.         chomp(my $comm  = <>);
  41.        
  42.         push @animales, [ $nuevo, $comm ];
  43.  
  44.         say GREEN "\t [+] ", RESET, 'El animal fue añadido correctamente';
  45.     }
  46.     if ($respuesta eq 'cls') {
  47.         system("clear");
  48.     }
  49.  
  50. } until $respuesta eq 'exit';
Coloreado en 0.003 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: Error en salto de línea

Notapor Mono_Ezpacial » 2012-11-12 01:15 @093

¡Excelente, bro! Lo haces muy bien, bro.

Me salieron dos dudas adicionales.

La primera, con respecto al programa anterior, ¿hay alguna forma de que los animales agregados se enumeren automáticamente? Sería algo así: El usuario agrega perro e inmediatamente a "perro" se le asigna el valor 1, Ok ¿Y para qué eso? Para poder jugar más fácil con ese objeto. La idea que tengo es que 'perro' sea igual a 1 y de igual forma 1 sea lo mismo que perro, y así sucesivamente con el resto de los objetos agregados.

Si nos damos cuenta esa información se guarda en un array, ¿se agranda el lio en este caso?
Espero que no.

Ok, la segunda es cómo hago para que el programa ejecute unas líneas anteriores. Un ejemplo:
Estamos en un hospital y los pacientes necesitan tomar un número para continuar en la camilla
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/perl/bin
  2. my $final = 0;
  3. my @turno;
  4. do {
  5.  
  6.     print "Bienvenido al Hospital\n";
  7.     print "Seleciona un número\n";
  8.     chomp( $ficha = <> );              # aquí selecionamos un número cualquiera, ej.: 521
  9.     push @turno, $ficha;
  10.     print "Tu turno es el $turno[$i]\n";
  11. } until $final;
  12.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Pero ¿qué pasa si tomas la misma ficha? Podría haber un caos. Esa es mi pregunta: ¿cómo podemos hacer que el programa se devuelva unas líneas atrás y vuelva a preguntar el número?

Esto fue lo que pude hacer para alertar del error al usuario, pero igual el usuario puede introducir el mismo número dos veces. Este es el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/perl/bin
  2. my $final = 0;
  3. my @turno;
  4. do {
  5.  
  6.     print "Bienvenido al Hospital\n";
  7.     print "Selecciona un número\n";
  8.     chomp( $ficha = <> );              # aquí seleccionamos un número cualquiera, ejemplo: 521
  9.     if ( @turno = @turno ) {
  10.         print "El número ya está en uso\n";
  11.  
  12.     }
  13.     else {
  14.         print "\n";
  15.     }
  16.     push @turno, $ficha;
  17.     print "Tu turno es el $turno[$i]\n";
  18. } until $final;
  19.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Eso es todo.

También me gustaría saber si la forma en la que estoy programando es correcta.

¡Gracias y un saludo!
Wake up, Neo... The Matrix has you... Follow the white rabbit. Knock, Knock, Neo.
Mono_Ezpacial
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-09-23 18:09 @798

Re: Error en salto de línea

Notapor explorer » 2012-11-12 10:13 @467

Mono_Ezpacial escribiste:¿hay alguna forma de que los animales agregados se enumeren automáticamente?
Si nos damos cuenta esa información se guarda en un array, ¿se agranda el lio en este caso?
De hecho, por usar un array, los elementos YA están numerados.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @animales = qw( perro gato caballo );   # creamos y definimos un array
say $animales[1];                          # sacamos a pantalla el segundo animal
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Los elementos de un array están indizados numéricamente, contando a partir de 0 ('perro' está en $animales[0]).

Lo tienes todo muy bien explicado en perldata (¡lee!).

Mono_Ezpacial escribiste:La segunda es cómo hago para que el programa ejecute unas líneas anteriores. Un ejemplo:
Estamos en un hospital y los pacientes necesitan tomar un número para continuar en la camilla.

Pero ¿qué pasa si tomas la misma ficha? Podría haber un caos. Esa es mi pregunta: ¿cómo podemos hacer que el programa se devuelva unas líneas atrás y vuelva a preguntar el número?
¿Y por qué permitir al usuario escoger un número? Si somos el Hospital, nosotros le daremos ese número.

Solo tienes que hacer un bucle por todo el array, preguntando (if) si ese elemento está definido (defined). Si lo está, pasamos al siguiente elemento (hay un enfermo en esa posición). Si no, esa posición está vacía, así que metemos ahí al enfermo y terminamos el bucle.

Si, en cambio, queremos que sea el propio enfermo el que elija el número, entonces el algoritmo es:
  • Iniciamos un bucle (while, por ejemplo)
  • Le solicitamos el número
  • Comprobamos si existe ese número en el array de enfermos
  • Si sí está, el bucle continúa, para preguntarle por otro número distinto
  • Si no está, salimos del bucle y lo guardamos en el array


Mono_Ezpacial escribiste:También me gustaría saber si la forma en la que estoy programando es correcta.
Si el programa funciona, y el código es fácil de leer, entonces sí que es correcto. Vamos, conque funcione bien, vale (al ordenador le da igual si lo escribes feo, pero a ti no, si al cabo de unos meses, no sabes qué es lo que has escrito).
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: Error en salto de línea

Notapor Mono_Ezpacial » 2012-11-12 15:37 @692

Me he dado cuenta que en mi programa hay varios errores de ese tipo. Me preguntaba si existe alguna sintaxis que su función sea redirigir al usuario a la primera línea del programa. Creo que de esta forma ahorraría mucho tiempo, la sintaxis sería algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (expresion) {
  2.     return to line 1
  3. } else {
  4.     print "Continue\n";
  5. }
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¡ATENCIÓN! Sé que esa no es la sintaxis, es solo para ilustrar la idea.
Estuve buscando alguna sintaxis que hiciera algo similar, no la encontré.

Gracias por el perldata, lo estoy leyendo.

¡Saludos!
Wake up, Neo... The Matrix has you... Follow the white rabbit. Knock, Knock, Neo.
Mono_Ezpacial
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-09-23 18:09 @798

Re: Error en salto de línea

Notapor explorer » 2012-11-12 17:52 @786

Ya te dije que con un while() lo puedes resolver:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $se_cumple_la_condicion = 0;
  2.  
  3. while( not $se_cumple_la_condicion) {
  4.  
  5.     # leemos datos
  6.  
  7.     # procesamos
  8.  
  9.     if (not expresión) {
  10.         $se_cumple_la_condicion = 1;    # indicamos que queremos salir
  11.     }
  12. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Otra forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while( 1 ) {    # para siempre (bucle infinito)
  2.  
  3.     # leemos datos
  4.  
  5.     # procesamos
  6.  
  7.     if (not expresión) {
  8.         last;                    # indicamos que queremos terminar el bucle, y se sale
  9.     }
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo mismo para do { } until():

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. do {
  2.  
  3.     # leemos datos
  4.  
  5.     # procesamos
  6.  
  7. } until expresion;      # repetimos el bucle mientras la expresión sea falsa
  8.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

O do {} while():

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. do {
  2.  
  3.     # leemos datos
  4.  
  5.     # procesamos
  6.  
  7. } while expresion;      # repetimos el bucle mientras la expresión sea verdadera
  8.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


También puedes usar una etiqueta y un goto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. BUCLE:
  2.  
  3. # leemos datos
  4.  
  5. # procesamos
  6.  
  7. if (expresión) {
  8.     goto BUCLE;
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero... si lo haces así, no obtendrás trabajo en ninguna empresa.
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: Error en salto de línea

Notapor Mono_Ezpacial » 2012-11-14 23:07 @005

Ok, Gracias por ayudarme en todas las dudas que he tenido. La verdad me fue de gran ayuda. Yn saludo y nuevamente gracias, explorer.
Wake up, Neo... The Matrix has you... Follow the white rabbit. Knock, Knock, Neo.
Mono_Ezpacial
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-09-23 18:09 @798


Volver a Básico

¿Quién está conectado?

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