2011-05-26 71 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