2009-10-22 7 views
10

Estoy tratando de recopilar los valores de la línea de comandos usando Getopt::Std en mi script Perl.¿Cómo puedo establecer valores predeterminados usando Getopt :: Std?

use Getopt::Std; 
$Getopt::Std::STANDARD_HELP_VERSION = 1; 
getopts('i:o:p:'); 
my $inputfile = our $opt_i; 
my $outputfile = our $opt_o; 
my $parameter_value = our $opt_p; 

Aquí las dos primeras variables ($ archivo de entrada, $ OutputFile) son obligatorios, pero la última variable ($ parameter_value) es opcional y se puede omitir.

Estoy tratando de establecer un valor por defecto a la última variable ($ parameter_value) cuando se ignora el indicador -p en la línea de comando.

He intentado utilizar esto:

my $parameter_value = our $opt_p || "20"; 

Aquí sus pases el valor correcto cuando -p bandera se ignora en la línea de comandos. Pero el problema es cuando estoy proporcionando algún valor desde la línea de comando (por ejemplo -p 58), el mismo valor 20 se pasa al programa en lugar de 58 que pasé de la línea de comando.

¿Pueden ayudarme señalando los errores que estoy cometiendo aquí?

Gracias.

Respuesta

16
#/usr/bin/perl 

use strict; 
use warnings; 

use Getopt::Std; 

getopts('i:o:p:'); 
our($opt_i, $opt_o, $opt_p); 

my $inputfile = $opt_i; 
my $outputfile = $opt_o; 
my $parameter_value = $opt_p || "20"; 

print "$_\n" for $inputfile, $outputfile, $parameter_value; 
 
C:\Temp> ks -iinput -ooutput -p55 
input 
output 
55 
 
C:\Temp> ks -iinput -ooutput 
input 
output 
20 
+0

Bueno :) = +1 – DVK

+0

thanan Sinan, Esto funciona muy bien y conserva el formato de mi codificación. Gracias una tonelada – Suren

+5

Si está utilizando 5.10+, sería mejor usar '//' en lugar de '||' porque este último prueba la verdad, no la definición. Evitará que pueda pasar valores falsos (por ejemplo, 0). La forma prolija de obtener un comportamiento equivalente antes de 5.10 es '$ x = definido $ y? $ y: Z' donde 'Z' es el valor predeterminado. –

17

Lo mejor es usar GetOpt::Long y usar un hash en lugar de variables individuales. entonces puede pasar de valores predeterminados por la pre-poblar la matriz

use Getopt::Long; 
    my %opts = (parameter => 20); 
    GetOptions(\%opts, 
      'p|parameter=i', 
      'o|outputfile=s', 
      'i|inputfile=s' 
    ) or die "Invalid parameters!"; 

    # I didn't bother cloning STANDARD_HELP_VERSION = 1; 
+0

Gracias Brian D Foy funciona ahora :) – Suren

+2

;);););););) – DVK

+0

Sinan - (1) Usted acaba de destruir la broma :-(; (2) Do Obtengo una insignia para dos luminarias Perl que editan mi publicación el mismo día? :) – DVK

1

Sugiero establecer las variables de exclusión a los valores predeterminados antes de llamar getopts. Además, puede usar las variables $ opt_ en su mensaje de uso para mostrar los valores predeterminados.

use Getopt::Std; 
$Getopt::Std::STANDARD_HELP_VERSION = 1; 
our $opt_p = 20; 
sub HELP_MESSAGE { print " -p parameter value (default $opt_p)\n"; } 
getopts('i:o:p:'); 
my $inputfile = our $opt_i; 
my $outputfile = our $opt_o; 
my $parameter_value = our $opt_p; 
+0

O simplemente use '$ opt_i' cada vez que lo necesite. Entonces está claro que es un parámetro. – Otheus

0
#/usr/bin/perl 
use strict; 
use warnings; 
use Getopt::Std; 

$Getopt::Std::STANDARD_HELP_VERSION = 1; 

my %opts =(); 
getopts('i:o:p:', \%opts); 
my $inputfile = $opts{i}; 
my $outputfile = $opts{o}; 
my $parameter_value = $opts{p} || "20"; 
print "$inputfile, $outputfile, $parameter_value\n"; 
Cuestiones relacionadas