2011-04-13 36 views
2

支持空間我有一個Perl腳本,它採用類似的Perl的Getopt ::長,對參數

automate -action build,deploy -modules chat,email,login getopts的long.A命令很容易處理。

我想實現的是,允許用戶在參數之間給出空格。

automate -action build, deploy -modules chat, email, login

問題是,GetOpt::Long內部使用@ARGV,根據需要設置變量和空間改變@ARGV陣列,這反過來將只放「建設」爲動作,並且只將「聊天」作爲腳本的模塊,忽略其他參數傳遞。

有沒有一種簡單的方法來解析perl中的上述命令行?

我希望有,因爲否則,我將不得不使用一種非常冒險的方式在傳遞給GetOpts之前更改@ARGV數組。

有沒有其他強大的圖書館,這將爲我做這個?

--------------------------- Tailor made script ---------------- ----------------

GetOptions("action=s{1,4}"=>\@myactions, 
      "modules=s{,}"=>\@mymodules); 

foreach(@mymodules) 
{ 
     if($_ eq $mymodules[0]) 
     { 
      $mymodules= $mymodules.$_; 
      next; 
     } 
     if($dashboards =~ m/,$/ || $_ =~ m/^,/) 
     { 
      $mymodules= $mymodules.$_; 
     } 
     else 
     { 
      $mymodules= $mymodules.",".$_; 
     } 
} 
+0

這不是一個好主意 - 有空格分隔的參數列表是違背大多數CLI界面標準。你不應該偏離大多數用戶在設計用戶界面(包括命令行包含的)時不熟悉的東西 – DVK 2011-04-13 20:21:31

回答

4

請參閱Getopt :: Long perldoc中的Options with multiple values部分。它看起來類似於你正在尋找的東西。

例子:

GetOptions ("action=s{,}" => \@valuelist); 
    @values = split(/[\s,]+/,join(',' , @valuelist)); 

    # @values will contain the list of values passed to the option. 
    # This can handle the scenarios: 
    # <command> -action build,deploy 
    # <command> -action build, deploy 
    # <command> -action build deploy 
+0

是的,已經檢查出來了。這隻會讓我的東西與空白區分開,逗號不會構成默認的論點...但是,我想出了我自己的腳本來完成這些東西,請讓我知道是否有任何陷阱..這將是一個很大的幫助。我會在某個時候更新我的問題。 – Neeraj 2011-04-13 08:57:08

+0

@Neeraj - 是的,你是對的。默認值是將多個值用空格分隔。 但是,如果您選擇使用分隔符,是不是可以分割以獲取傳遞的值列表? 我已經用我想到的解決方案解決了我的問題,以防萬一... – Shalini 2011-04-13 16:29:04

+0

您發佈的答案,我已經在代碼中實現了,但只有更好,更強的版本。答案。腳本甚至允許,像--action deploy,package這樣的東西。你發佈的腳本,這將會以一個錯誤的值字符串結束,因爲'deploy'','package'將被視爲三種不同的參數。 – Neeraj 2011-04-14 06:21:11

0

這是一個非標準的命令行用法 - 所以你需要一個非標準的命令行分析器。如果您在http://search.cpan.org/處搜索「getopt」,則會列出大約180個單獨的條目,因此有很多可供選擇的條目。從表面上看,您只需要識別一些較長的選項名稱,然後在讀取之前繼續將非選項參數應用於先前的選項名稱。

你會堅持使用尾隨逗號嗎?這樣做感覺很笨拙。我可以看到:

automate -action build deploy -modules chat email login 

在一些參數結尾處需要逗號會感覺 - 很奇怪。

你需要考慮雙破折號選項是否具有特殊的意義,而無論是單破折號選項具有特殊的意義:

somecmd -f - -- 

我不知道,處理您所選擇的一個Perl模塊符號或其上的任何微小變化。這與說沒有這樣的模塊並不完全相同,但是您嘗試了一個稍微不尋常的參數解析風格,所以很可能沒有人實現了您想要的。