• Publicidad

Getopt::Long

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Getopt::Long

Notapor otronovato » 2013-09-16 05:49 @284

He estado tanteando Getopt::Long para darle un poco más de robustez a mis programas. Las posibilidades que ofrece para controlar los parámetros pasados al programa son exactamente lo que buscaba. He hecho este código para probarlo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl                                                                                                                            
  2.  
  3. use v5.12;
  4. use strict;
  5. use warnings;
  6. use MIME::Base64;
  7. use Getopt::Long;
  8.  
  9. #Programa de codificación y decodificación en base64. De acuerdo con la información del módulo #MIME::Base64 codificaremos en múltiplos de 57 bytes: "This ensures that the base64 lines
  10. #line up and that you do not end up with padding in the middle. 57
  11. #bytes of data fills one complete base64 line (76 == 57*4/3)"                                                                              
  12.  
  13. sub enc{
  14.  
  15.     open my $fhi, "<", $_[0] or die "$!\n";
  16.     binmode $fhi;
  17.     open my $fho, ">", $_[1] or die "$!\n";
  18.     while(read($fhi, my $buffer, 30*57)){
  19.         print $fho &encode_base64($buffer);
  20.     }
  21.     close $fho;
  22.     close $fhi;
  23.     return 1;
  24. }
  25.  
  26. sub dec{
  27.  
  28.     open my $fhi, "<", $_[0] or die "$!\n";
  29.     binmode $fhi;
  30.     open my $fho, ">", $_[1] or die "$!\n";
  31.     while(read($fhi, my $buffer, 30*57)){
  32.         print $fho &decode_base64($buffer);
  33.     }
  34.     close $fho;
  35.     close $fhi;
  36.     return 1;
  37. }
  38.  
  39. my ($entrada, $salida, $func);#Parámetros del programa.                                                                                    
  40.  
  41. die "Uso: $0 --entrada <fichero> --salida <fichero> --op <cod|decod>\n" if (@ARGV != 6 or !GetOptions('entrada=s' => \$entrada, 'salida=s' \
  42. => \$salida, 'op=s' => \$func));
  43.  
  44. if($func eq 'cod'){
  45.  
  46.     my $op = &enc($entrada, $salida);
  47.     say "Fichero $entrada procesado";
  48.     exit 1;
  49. }
  50.  
  51. elsif($func eq 'dec'){
  52.  
  53.     my $op = &dec($entrada, $salida);
  54.     say "Fichero $entrada procesado";
  55.     exit 1;
  56. }
  57. else{
  58.  
  59.     say "Opciones --op no reconocidas. Valores 'cod' o 'dec'";
  60.     exit 1;
  61.  
  62. }
  63.  
  64.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Tras buscar algún manual, (porque perldoc -m Getopt::Long me muestra el código, pero no su documentación), he visto que si quiero utilizar una opción como la de 'op' en mi programa que sólo puede tomar dos valores, ('cod' or 'dec'), puedo hacer dos cosas: usar una opción 'op=i' y usarla como 'flag' para, una vez comprobada, ejecutar la función codificar o la de decodificación, o bien, la opción que he tomado 'op=s' y comprobar los valores de la cadena para tomar la decisión de qué función ejecutar.

Me queda la duda de si Getopt::Long no tendrá habilitada una forma de 'parsear' por sí mismo un rango de valores posibles para cada opción.

Entiendo también que en la condición
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (@ARGV != 6 or !GetOptions('entrada=s' => \$entrada, 'salida=s' \
  2. => \$salida, 'op=s' => \$func));
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
comprobar el número de parámetros es redundante. ¿Correcto?.

Un saludo
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Publicidad

Re: Getopt::Long

Notapor explorer » 2013-09-16 07:51 @369

Para ver la documentación de un módulo, se hace igual que con el resto de la documentación de Perl.

Prueba con perldoc Getopt::Long
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: Getopt::Long

Notapor otronovato » 2013-09-16 10:34 @482

Es lo primero que probé:

perldoc -m Getopt::Long


Pero el resultado es el código fuente. Al final, donde debería aparecer la documentación sólo me aparece:

################ Documentation ################
(END)


He encontrado documentación en http://perldoc.perl.org/Getopt/Long.html, pero lo más parecido a lo que busco sería:

Options with values
For options that take values it must be specified whether the option value is required or not, and what kind of value the option expects.
Three kinds of values are supported: integer numbers, floating point numbers, and strings.
If the option value is required, Getopt::Long will take the command line argument that follows the option and assign this to the option variable. If, however, the option value is specified as optional, this will only be done if that value does not look like a valid command line option itself.
my $tag = ''; # option variable with default value
GetOptions ('tag=s' => \$tag);
In the option specification, the option name is followed by an equals sign = and the letter s. The equals sign indicates that this option requires a value. The letter s indicates that this value is an arbitrary string. Other possible value types are i for integer values, and f for floating point values. Using a colon : instead of the equals sign indicates that the option value is optional. In this case, if no suitable value is supplied, string valued options get an empty string '' assigned, while numeric options are set to 0 .


Entiendo entonces que debo capturar y tratar la entrada en mi propio código, fuera del módulo. ¿Correcto?

Un saludo
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Re: Getopt::Long

Notapor explorer » 2013-09-16 10:37 @484

Por favor, fíjate en mi respuesta, y verás que no aparece '-m'.

No he manejado nada este módulo, pero según el manual, se espera el tipo de dato por cada argumento. No he visto nada referente a lo de comprobar rangos de valores. Pero si no lo hace este módulo, casi seguro que lo puede hacer otro de la familia Getopt::

Y, sí: si el módulo no lo hace, deberás hacerlo en tu código.
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: Getopt::Long

Notapor otronovato » 2013-09-16 12:52 @578

¡Gracias!

Hasta ahora siempre había encontrado la documentación del módulo bajo el código al invocar 'perldoc -m', por éso creía que era la forma correcta de hacerlo.

Perdóname por haberte hecho perder el tiempo.

Un saludo.
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300


Volver a Módulos

¿Quién está conectado?

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