2009-10-22 70 views
10

我想在我的Perl腳本中使用Getopt::Std從命令行收集值。如何使用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; 

在這裏,前兩個變量($ inputfile中,$ OUTPUTFILE)是強制性的,但最後一個變量($ PARAMETER_VALUE)是可選的,可以忽略不計。

我想在命令行忽略-p標誌時,默認情況下將一些值設置爲最後一個變量($ parameter_value)。

我試圖使用這樣的:

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

在這裏它的通行證時-p標誌在命令行無視正確的值。但問題是,當我從命令行提供一些值(例如-p 58)時,將相同的值20傳遞給程序,而不是從命令行傳遞給58的值。

你能幫我指出我在這裏犯的錯誤嗎?

謝謝。

回答

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

好的:) = +1 – DVK 2009-10-22 18:34:00

+0

thanx思南,這工作非常好,並保留我的編碼格式。感謝一噸。 – Suren 2009-10-22 18:38:15

+5

如果您使用5.10+,最好使用'//'而不是'||',因爲後者測試的是真實性,沒有定義。它會阻止你能夠傳入錯誤的值(例如0)。在5.10之前獲得等同行爲的冗長方法是'$ x = defined $ y? $ y:Z'其中'Z'是默認值。 – 2009-10-22 23:38:48

17

最好的辦法是使用GetOpt::Long並使用散列而不是單個變量。 然後你就可以通過預填充數組

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

感謝布賴恩·d FOY現在的工作:) – Suren 2009-10-22 18:36:30

+2

;);););););) – DVK 2009-10-22 18:40:27

+0

思南 - (1)你只是破壞了:-(笑話;(2)不要我在同一天得到了整個兩個Perl專業人士的徽章,編輯我的帖子:) :) – DVK 2009-10-22 23:54:02

1

我建議選擇變量在調用getopts的設置爲默認值傳遞默認值。此外,您可以在使用消息中使用$ opt_變量來顯示默認值。

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

或者只在需要時使用'$ opt_i'。那麼很明顯這是一個參數。 – Otheus 2016-01-22 14:06:19

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";