2011-05-26 49 views
2

Ruby的GetoptLong文檔給我的印象是它會從ARGV中刪除解析的選項。這裏是有問題的一段話:Ruby GetoptLong修改ARGV?

例如,如果-a不需要論證和可選-b需要一個參數, 解析「-a一個-b二三」會導致(「-a」 ,'')和('-b','two')作爲選項/參數對處理,'1','3'留在ARGV中。

但是,這似乎並不是這種情況。下面是我的程序:

#!/usr/bin/env ruby 

require "getoptlong" 
opts = GetoptLong.new(
    ["--start", "-s", GetoptLong::REQUIRED_ARGUMENT], 
    ["--base", "-b", GetoptLong::REQUIRED_ARGUMENT] 
) 

puts ARGV 

這裏是輸出:

$ number-photos --start 2 --base foo * 
--start 
2 
--base 
foo 
aac-to-mp3 
backup-wp-uploads 
exiv-webcam-imgs 
get-updates 
music-to-lily 
number-photos 
ogg-to-mp3 
rename-music 
restore-uploads 
resymlink 
sprints 
sync-jt 
sync-st 
timestamp 
unix-names 

(我沒有檢查我的紅寶石1.9.2。)

我可以手動刪除選項,但這會有點讓人頭痛,因爲根據你通過它們的方式,每個陣列可能佔用陣列中的一個或兩個插槽(--base=foo--base foo)。如果GetoptLong能夠爲我移除它會更方便。有沒有辦法做到這一點?

回答

4

我想我明白,這意味着該項目沒有放在getopt組..它留在ARGV,就像其他一切......爲什麼它會修改ARGV?

更新 eww。在對文檔中的示例進行了一些實驗之後,在opts.each運行之前,它不會從ARGV中刪除項目......似乎刪除是在opts中訪問項目的副作用。

非常糟糕的形式。 :(

+0

是的,這工作!我同意,這是相當噁心。唉:我想一個不好的解決方案比沒有更好,非常感謝它找到它!! 只是fyi,我認爲它可能會修改ARGV,因爲這是Perl Getopt :: Long類的功能是什麼,只是一種瘋狂的猜測 – Joyce 2011-05-26 02:15:44

+0

也許這是由於底層的C庫實現引起的,但它本質上非常不明顯。 – DGM 2011-05-26 12:16:07