Ver Mensaje Individual
  #7 (permalink)  
Antiguo 01/07/2010, 05:05
Avatar de neodani
neodani
 
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 10 meses
Puntos: 20
Respuesta: No terminar hasta que no se elija una opción valida

Cita:
Iniciado por jferrero Ver Mensaje
Ya lo dice el manual del módulo: si el usuario elige una opción que no está en el menú, devolverá un valor indefinido.

Lo que puedes hacer es meter la llamada al menú dentro de un bucle que no termine mientras el usuario no haya metido un valor válido.

Código Perl:
Ver original
  1. do {
  2.  
  3.     # llamamos al menú
  4.  
  5. } until ($answer);
Lo intenté como dijiste, pero me devuelve un error

Código PERL:
Ver original
  1. 1 #!/usr/bin/perl
  2.   2
  3.   3 use strict;
  4.   4 use warnings;
  5.   5 use diagnostics;
  6.   6 use Term::Menu;
  7.   7
  8.   8 my $var  = 0;
  9.   9 my $sede = 0;
  10.  10 #my $answer = 0;
  11.  11
  12.  12     my $prompt = Term::Menu->new(
  13.  13         beforetext      => 'Por favor, elija una de las siguientes opciones:',
  14.  14         aftertext       => 'Introduzca la sede por favor  ',
  15.  15         nooptiontext    => 'No seleccionaste ninguna opcion',
  16.  16         toomanytries    => 'Inicia el programa nuevamente y pulse alguna tecla por favor ',
  17.  17     );
  18.  18 do {
  19.  19
  20.  20     my $answer = $prompt->menu(
  21.  21         resguardo     => ["resguardo",                1 ],
  22.  22         sqlaltas      => ["sqlaltas",                 2 ],
  23.  23         sqlcronograma => ["sqlcronogramas",           3 ],
  24.  24         Ayuda         => ["Ayuda sobre el  Programa", 4 ],
  25.  25         Salir         => ["Salir del Programa",       5 ],
  26.  26     );
  27.  27 } until ($answer);
  28.  28
  29.  29 print "\n";
  30.  30 print "$answer \n";
  31.  31
  32.  32 if ($answer eq 'resguardo') {
  33.  33     print "Has elegido sede resguardo ";
  34.  34 }
  35.  35 elsif ($answer eq 'sqlaltas') {
  36.  36     print "Has elegido sede sqlaltas ";
  37.  37     }


Código:
Global symbol "$answer" requires explicit package name at ./test.pl line 27.
Global symbol "$answer" requires explicit package name at ./test.pl line 30.
Global symbol "$answer" requires explicit package name at ./test.pl line 32.
Global symbol "$answer" requires explicit package name at ./test.pl line 35.
Execution of ./test.pl aborted due to compilation errors (#1)
    (F) You've said "use strict vars", which indicates that all variables
    must either be lexically scoped (using "my"), declared beforehand using
    "our", or explicitly qualified to say which package the global variable
    is in (using "::").

Uncaught exception from user code:
        Global symbol "$answer" requires explicit package name at ./test.pl line 27.
Global symbol "$answer" requires explicit package name at ./test.pl line 30.
Global symbol "$answer" requires explicit package name at ./test.pl line 32.
Global symbol "$answer" requires explicit package name at ./test.pl line 35.
Execution of ./test.pl aborted due to compilation errors.
 at ./test.pl line 37
root@monitor:/home/dperez# vim test.pl

Y si declaro la variable en la linea 10
10 my $answer = 0;

No me devuelve ningún error, pero me pregunta continuamente las opciones del menú, aunque elija una correcta, no entiendo porque se comporta así


Código:
Por favor, elija una de las siguientes opciones:
      1) resguardo
      2) sqlaltas
      3) sqlcronogramas
      4) Ayuda sobre el  Programa
      5) Salir del Programa
Introduzca la sede por favor  3
Por favor, elija una de las siguientes opciones:
      1) resguardo
      2) sqlaltas
      3) sqlcronogramas
      4) Ayuda sobre el  Programa
      5) Salir del Programa
Introduzca la sede por favor  9
No seleccionaste ninguna opcion
Inicia el programa nuevamente y pulse alguna tecla por favor
Por favor, elija una de las siguientes opciones:
      1) resguardo
      2) sqlaltas
      3) sqlcronogramas
      4) Ayuda sobre el  Programa
      5) Salir del Programa
Introduzca la sede por favor  1
Por favor, elija una de las siguientes opciones:
      1) resguardo
      2) sqlaltas
      3) sqlcronogramas
      4) Ayuda sobre el  Programa
      5) Salir del Programa
Introduzca la sede por favor