2009-10-22 17 views
10

Sto cercando di raccogliere i valori dalla riga di comando utilizzando Getopt::Std nel mio script Perl.Come posso impostare i valori predefiniti 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; 

Ecco le prime due variabili ($ inputfile, $ OUTPUTFILE) sono obbligatori, ma l'ultima variabile ($ parameter_value) è opzionale e può essere ignorato.

Sto cercando di impostare un valore di default sull'ultima variabile ($ parametro_valore) quando il flag -p viene ignorato nella riga di comando.

Ho provato ad utilizzare questo:

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

Ecco i suoi passi il valore corretto quando -p flag è ignorato a riga di comando. Ma il problema è quando sto fornendo un valore dalla riga di comando (ad esempio -p 58), lo stesso valore 20 è passato al programma invece di 58 che ho passato dalla riga di comando.

Potete per favore aiutarmi indicando gli errori che sto facendo qui?

Grazie.

risposta

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

Buono :) = +1 – DVK

+0

Grazie, Sinan, funziona molto bene e conserva il formato della mia codifica. Grazie mille. – Suren

+5

Se usi 5.10+ sarebbe meglio usare '//' invece di '||' perché quest'ultimo prova per la verità, non per definizione. Vi impedirà di essere in grado di passare in valori falsi (ad esempio 0). Il modo prolisso per ottenere un comportamento equivalente prima di 5.10 è '$ x = definito $ y? $ y: Z' dove 'Z' è il valore predefinito. –

17

La cosa migliore è utilizzare GetOpt::Long e utilizzare un hash anziché singole variabili. Quindi è possibile passare i valori di default pre-popolando la matrice

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

Grazie brian d foy ora funziona :) – Suren

+2

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

+0

Sinan - (1) Hai appena distrutto la battuta :-(; (2) Do Ricevo un badge per due interi luminari Perl che modificano il mio post nello stesso giorno? :) – DVK

1

Suggerisco di impostare le variabili scegliere di default prima di chiamare getopts. Inoltre, puoi utilizzare le variabili $ opt_ nel tuo messaggio di utilizzo per mostrare i valori predefiniti.

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

Oppure usa '$ opt_i' ogni volta che ne hai bisogno. Quindi è chiaro che è un parametro. – 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"; 
Problemi correlati