PL::Tutu
con las funciones de compilación y los correspondientes
guiones de compilación.
Mejore el script tutu
para que acepte opciones desde la línea de comandos.
Debera soportar al menos las siguientes opciones:
--usage
Muestra de forma concisa el comando de uso
--help
Un resumen de cada opción disponible
--version
Muestra la versión del programa
--man
Muestra la documentación
Use para ello el módulo Getopt::Long .
Este módulo provee la función GetOptions la cual
se atiene a los estándares de especificación
de opciones en la línea de comandos POSIX y GNU.
Esta función soporta el uso del guión doble --
y el simple así como admitir el prefijo mas corto
que deshace la ambiguedad entre las diferentes opciones.
La llamada a
GetOptions analiza la línea de comandos en
ARGV
inicializa la variable asociada de manera adecuada. Retorna un valor verdadero
si la línea de comandos pudo ser procesada con
En caso contrario emitirá
un mensaje de error y devolverá falso. Recuerde hacer
perldoc Getopt::Long
para obtener información mas detallada
El siguiente ejemplo ilustra el uso de Getopt::Long
.
Se hace uso también del módulo (función pod2usage en la línea 63)
Pod::Usage
el cual permite la documentación empotrada.
nereida:~/LEyapp/examples> cat -n treereg 1 #!/usr/bin/perl -w 2 use strict; 3 use Parse::Eyapp::YATW; 4 use Parse::Eyapp::Node; 5 use Parse::Eyapp::Treeregexp; 6 use Carp; 7 use Getopt::Long; 8 use Pod::Usage; 9 10 my $infile; 11 my $outfile; 12 my $packagename; 13 my $prefix = ''; 14 my $syntax = 1; 15 my $numbers = 1; 16 my $severity = 0; # 0 = Don't check arity. 1 = Check arity. 17 # 2 = Check arity and give a warning 3 = ... and croak 18 GetOptions( 19 'in=s' => \$infile, 20 'out=s' => \$outfile, 21 'mod=s' => \$packagename, 22 'prefix=s' => \$prefix, 23 'severity=i' => \$severity, 24 'syntax!' => \$syntax, 25 'numbers!' => \$numbers, 26 'version' => \&version, 27 'usage' => \&usage, 28 'help' => \&man, 29 ) or croak usage(); 30 31 # If an argument remains is the inputfile 32 ($infile) = @ARGV unless defined($infile); 33 die usage() unless defined($infile); 34 35 my $treeparser = Parse::Eyapp::Treeregexp->new( 36 INFILE => $infile, 37 OUTFILE => $outfile, 38 PACKAGE => $packagename, 39 PREFIX => $prefix, 40 SYNTAX => $syntax, 41 NUMBERS => $numbers, 42 SEVERITY => $severity 43 ); 44 45 $treeparser->generate(); 46 47 sub version { 48 print "Version $Parse::Eyapp::Treeregexp::VERSION\n"; 49 exit; 50 } 51 52 sub usage { 53 print <<"END_ERR"; 54 Supply the name of a file containing a tree grammar (.trg) 55 Usage is: 56 treereg [-m packagename] [[no]syntax] [[no]numbers] [-severity 0|1|2|3] \ 57 [-p treeprefix] [-o outputfile] -i filename[.trg] 58 END_ERR 59 exit; 60 } 61 62 sub man { 63 pod2usage( 64 -exitval => 1, 65 -verbose => 2 66 ); 67 } 68 __END__ 69 70 =head1 SYNOPSIS 71 72 treereg [-m packagename] [[no]syntax] [[no]numbers] [-severity 0|1|2|3] \ 73 [-p treeprefix] [-o outputfile] -i filename[.trg] 74 treereg [-m packagename] [[no]syntax] [[no]numbers] [-severity 0|1|2|3] \ 75 [-p treeprefix] [-o outputfile] filename[.trg] 76 ... # Follows the documentation bla, bla, bla
Ahora podemos ejecutar el guión de múltiples formas:
nereida:~/LEyapp/examples> treereg -nos -nonu -se 3 -m Tutu Foldonly1.trg nereida:~/LEyapp/examples> treereg -nos -nonu -s 3 -m Tutu Foldonly1.trg Option s is ambiguous (severity, syntax) nereida:~/LEyapp/examples> treereg -nos -bla -nonu -m Tutu Foldonly1.trg Unknown option: bla nereida:~/LEyapp/examples>
La librería estandar de Perl incluye el módulo Getopt::Long
.
No es el caso de Pod::Usage
. Descarge el módulo e instalelo
en un directorio local en el que tenga permisos. Si es preciso repase las secciones
[4] y
[4] de los apuntes de
introducción a Perl.