2009-10-22 17 views
10

Próbuję zebrać wartości z wiersza poleceń przy użyciu Getopt::Std w moim skrypcie Perl.Jak ustawić wartości domyślne za pomocą 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; 

Oto pierwsze dwie zmienne ($, $ plik_wyjściowy plik_wejściowy) są obowiązkowe, ale ostatnia zmienna ($ PARAMETER_VALUE) jest opcjonalny i może być ignorowane.

Próbuję ustawić wartość domyślnie na ostatnią zmienną ($ wartość_parametru), gdy flaga -p jest ignorowana w wierszu polecenia.

Próbowałem za pomocą tego:

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

Tutaj przechodzi jego prawidłowa wartość -P gdy flaga jest ignorowany w wierszu poleceń. Ale problem polega na tym, że dostarczam pewną wartość z wiersza poleceń (na przykład -p 58), ta sama wartość 20 jest przekazywana do programu zamiast do 58, które przekazałem z wiersza poleceń.

Czy możesz mi pomóc, wskazując błędy, które tu popełniam?

Dziękuję.

Odpowiedz

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

Dobrze :) = +1 – DVK

+0

thanx Sinan, Działa to bardzo dobrze i zachowuje format mojego kodowania. Za toną. – Suren

+5

Jeśli używasz wersji 5.10+, lepiej użyć '//' zamiast '||', ponieważ ten ostatni testuje prawdę, a nie zdefiniowaną. Zapobiegnie to przekazywaniu fałszywych wartości (np. 0). Długotrwałym sposobem uzyskania ekwiwalentnego zachowania przed 5.10 jest '$ x = zdefiniowany $ y? $ y: Z' gdzie 'Z' jest wartością domyślną. –

17

Najlepiej użyć GetOpt::Long i użyć skrótu zamiast poszczególnych zmiennych. Następnie można przekazać wartości domyślnych przez pre-wypełniania tablicę

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

Dzięki Brian d Foy to działa teraz :) – Suren

+2

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

+0

Sinan - (1) Po prostu zniszczył żart :-(; (2) Czy Dostaję odznakę dla dwóch luminarzy Perla redagujących mój wpis w tym samym dniu? :) – DVK

1

Proponuję ustawienie zmiennych opt do ustawień przed wywołaniem getopts. Dodatkowo możesz użyć zmiennych $ opt_ w swoim komunikacie o użyciu, aby wyświetlić wartości domyślne.

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

Lub po prostu użyj '$ opt_i' kiedy tylko tego potrzebujesz. Wtedy jasne jest, że to parametr. – 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"; 
Powiązane problemy