• Publicidad

Trabajando con módulos y un menú

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

Trabajando con módulos y un menú

Notapor tutoki » 2012-11-20 11:48 @533

Hola

Tengo para un mismo proyecto varios programas en Perl que quiero modular (pm). Aparte tengo la intención de que sean accesibles vía un menú muy simple.

Os pego un prototipo muy simple:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;    
  4. use lib('/home/cpb/Dropbox/WEB/workspace/PreSPA/montaje');
  5.     #modifica este path para tu uso personal
  6. #use buskeitor; # lo remarco
  7. my $opcion;
  8.  
  9. say qq(#####################################
  10. # Introduce 1 para Procesar imágenes
  11. # Introduce 2 para mostrar enlaces
  12. # Introduce 3 para copiar contenido
  13. #####################################);
  14.  
  15. chop( $opcion = <STDIN> );
  16.  
  17. if ( $opcion == "1" ) {
  18.         print "descargando imágenes...\n";
  19.         descargar_imagenes(); # del módulo pm buskeitor
  20.  
  21. }
  22. elsif ( $opcion == "2" ) {
  23.         print "descargando enlaces...\n";
  24.         descargar_enlaces(); # del módulo pm buskeitor
  25. }
  26. elsif ( $opcion == "3" ) {
  27.         print "descargando contenido a 'mitexto.txt'...\n";
  28.         descargar_contenido(); # del módulo pm buskeitor
  29. }
  30. else { print " te has colado bacalado, entre 1 y 3....\n" }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


¿Este tipo de programas con opciones se suele hacer así?

¿Se utiliza el módulo getopt?

SALUD...
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Publicidad

Re: Trabajando con módulos y un menú

Notapor explorer » 2012-11-20 20:59 @916

Bueno, se suele hacer si el número de opciones es bajo o muy bajo, pero a partir de una cierta cantidad, es mejor usar un módulo de despacho de opciones o de menú.

El módulo Getopt es para pasar y leer opciones desde la línea de comandos. Entonces, no estamos hablando de un menú que se le presenta al usuario.

Si el programa queremos hacerlo lo más completo, se podrían dar al usuario las dos opciones: si el programa se arranca sin argumentos que implican una selección, se le muestra el menú y esperamos su elección. En cambio, si el programa se arranca con argumentos, se ejecutan y se termina el programa.

Una forma esquemática de hacer una tabla de despacho, sería así (no probado):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %opciones = (
  2.     1 => \&descargar_imagenes,
  3.     2 => \&descargar_enlaces,
  4.     3 => \&descargar_contenido,
  5. );
  6.  
  7. print "Escoja [1/2/3]: "; chomp(my $opcion = <STDIN>);
  8.  
  9. $opciones{$opcion}->();   # ejecutamos
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo tienes más simplificado en un montón de módulos que existen en CPAN que se llaman 'dispatch'. Por ejemplo, Dispatch::Declare.
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: Trabajando con módulos y un menú

Notapor tutoki » 2012-11-22 18:20 @805

Hola

He estado practicando con el módulo de CPAN que me recomendaste. Desde luego hace lo que dices, muy fácil de implementar, aunque le encuentro un pero, aunque es más sobre de la idea que yo tenía en mente.

¿Hay algún modo de que el programa vuelva al principio como en un bucle?, es decir: yo elijo la opción y cuando acaba la ejecución de esa opción, no se acaba el programa sino que vuelvo al principio.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # dispatcher.pl
  3. use v5.14;
  4. use autodie;
  5.  
  6. use Dispatch::Declare;
  7.  
  8. say 'elija la opción : COPIAR / BORRAR / SALIR';
  9. chop( my $action = <STDIN> );
  10.  
  11. declare COPIAR => sub {
  12.         say 'Esto es un test COPIAR';
  13. };
  14.  
  15. declare BORRAR => sub {
  16.         say 'Esto es un test BORRAR';
  17. };
  18. declare SALIR => sub {
  19.         say 'Esto es un test SALIR';
  20. };
  21. declare DEFAULT => sub {
  22.         say 'has introducido mal la opción';
  23.         system("./dispatcher.pl");
  24. };
  25. run $action;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La última opción se ejecuta cuando no se ejecutan ninguna de las anteriores y vuelve a llamar al programa.

No me parece muy elegante, pero funciona.
¿Qué te parece?

SALUD...
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Re: Trabajando con módulos y un menú

Notapor explorer » 2012-11-23 07:02 @335

Si quieres un bucle, solo tienes que ponerlo. Por ejemplo, sería así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # dispatcher.pl
  3. use v5.14;
  4. use autodie;
  5.      
  6. use Dispatch::Declare;
  7.  
  8. ## Declaración de despachos
  9. declare COPIAR => sub {
  10.     say 'Esto es un test COPIAR';
  11. };
  12.      
  13. declare BORRAR => sub {
  14.     say 'Esto es un test BORRAR';
  15. };
  16.  
  17. declare SALIR => sub {
  18.     say 'Esto es un test SALIR';
  19. };
  20.  
  21. declare DEFAULT => sub {
  22.     say 'has introducido mal la opción';
  23. };
  24.  
  25. ## Bucle
  26. my $action;
  27. do {
  28.     print "Escoja [COPIAR / BORRAR / SALIR]: "; chomp($action = <STDIN>);
  29.      
  30.     run $action;
  31.  
  32. } while $action ne 'SALIR';             # repetir mientras $action "No Es igual a" 'SALIR'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


En cuanto a la forma de programar, este módulo no es más que un pequeño apaño de la solución que te comenté del hash. No hay problema si el número de opciones es más o menos pequeño. Y si el cuerpo de las subrutinas también es bajo.

En cambio, si el tamaño de las subrutinas crece mucho, es mejor ponerlo de esta manera (esquemática):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Al principio del programa, hacemos las declaraciones
  2. declare ACCION1 => \&accion1;       # aquí, resumen de lo que es accion1
  3. declare ACCION2 => \&accion2;       # lo mismo para accion2
  4. declare ACCION3 => \&accion3;       # ...
  5. # ...
  6. declare ACCION9 => \&accion9;
  7.  
  8. # Bucle y procesamiento
  9. # ...
  10.  
  11. # Subrutinas
  12. sub accion1 {                       # declaración y definición de accion1
  13.  
  14. }
  15.  
  16. sub accion2 {                       # declaración y definición de accion2
  17.  
  18. }
  19.  
  20. sub accion3 {                       # declaración y definición de accion3
  21.  
  22. }
  23.  
  24. # ...
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Si el número de líneas sigue creciendo, pues a lo mejor hay que pensar en otras posibilidades, como en la de modularizar las subrutinas, en archivos pm aparte.
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: Trabajando con módulos y un menú

Notapor tutoki » 2012-11-23 19:19 @847

Hola,

Me he atrevido con los módulos (pm) que era mi objetivo inicial

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4. use Dispatch::Declare;  
  5. use lib('/home/cpb/Dropbox/WEB/workspace/PreSPA/montaje/enconstruccion/');
  6.     #modifica este path para tu uso personal
  7. use borrar;
  8. use convertir;
  9. use montar;
  10.  
  11. my $action; # variable global, me daba error en el condicional WHILE
  12.  
  13. # declaraciones
  14. declare BORRAR => \&borrador;      
  15. declare CONVERTIR => \&convertidor;    
  16. declare MONTAR => \&montador;      
  17.  
  18.  
  19.  
  20. ## Bucle
  21. do {
  22.     print "Escoja [BORRAR / CONVERTIR / MONTAR / SALIR]: "; chomp($action = <STDIN>);
  23.      
  24.     run $action;
  25.  
  26. } while $action ne 'SALIR';             # repetir mientras $action "No Es igual a" 'SALIR'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Y un módulo de los tres:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package borrar;
  2. use v5.14;
  3. use autodie;
  4.  
  5. use Exporter;
  6. our @ISA    = qw(Exporter);
  7. our @EXPORT = qw( borrador ); # si pongo @EXPORT_OK, no funciona
  8.  
  9. sub borrador{
  10.        
  11.         say 'borrando';
  12. }
  13. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Bueno, no sé qué te parece el prototipo, yo estoy bastante contento, Gracias por todo.

SALUD...
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120


Volver a Básico

¿Quién está conectado?

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