2016-03-04 16 views
3

我正在使用perl程序(perl 5.8)。該程序爲其輸入使用命令行參數。 我面臨的問題是這個 - 我使用多個命令行參數。 例如當一個參數錯誤地將其他參數作爲其值時,perl中的多個命令行參數

tool -f "arg1_val" -p "arg2_val" 

但在情況下,當用戶忘記指定值說

tool -f -p "arg2_val" 

而是示數出來的,它假定-f -p =

我使用Getopt::Long和日常GetOptions

GetOptions ("f=s" => \$opt_f, 
      "p=s" => \$opt_p, 
      ); 
+0

一個不錯的[關於Getopt :: Long的文章](http://perltricks.com/article/195/2015/10/21/Professional-scripts-are-a-snap-with-Getopt--長/)。 – jreisinger

回答

0

您會期待什麼錯誤? -f選項有一個參數,並且未指定-p選項。你必須自己處理強制或額外的選項:

die "Missing -p\n" unless defined $opt_p; 
die "Missing -f\n" unless defined $opt_f; 
die "Extra arguments @ARGV\n" if @ARGV; 
4

您應該使用:而不是=

您應該檢查Getopt::Long中的「選項規格摘要」。這是從GetOptions

=s:Option採用強制字符串參數。該字符串將被分配給選項變量。請注意,即使字符串參數 以 - 或 - 開頭,它本身也不會被視爲選項。

:s:Option接受一個可選的字符串參數。該字符串將被分配給選項變量 。如果省略,它將被分配「」 (空字符串)。如果字符串參數以 - 或 - 開頭,則 將被視爲一個選項。

下面應該工作。如果您省略任何參數,則相應的變量將被分配爲""

GetOptions ('f:s' => \$opt_f, 
      'p:s' => \$opt_p, 
      ) or die("Error in command line arguments\n"); 

# later you can check for argument variable if any option is mendatory for you. 
die "No value passed to -f\n" unless($opt_f); 
+1

這指甲。我完全忘了差別。 – zdim

+0

謝謝你讓我知道區別。在大多數文件中,= s和:s之間的區別僅在可選/非可選方面進行解釋。但是要記住這一點很重要 - 「即使字符串參數以 - 或 - 開頭,它不會被認爲是它自己的選項」 –

相關問題