Ruby GetoptLong修改了ARGV?

时间:2011-05-26 01:26:52

标签: ruby getopt getopt-long

Ruby GetoptLong的文档给我的印象是它将从ARGV中删除已解析的选项。这是有问题的段落:

  

例如,如果-a不需要参数,-b可选择接受参数,   解析'-a one -b two three'将导致(' - a','')和(' - b','two')作为选项/ arg对处理,并且'one','three'正在处理留在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

(我确实检查过我在ruby 1.9.2上。)

我可以手动删除这些选项,但这有点令人头疼,因为根据你传入它们的方式,每个都可以占用数组中的一个或两个插槽(--base=foo vs. { {1}})。如果GetoptLong可以为我删除它们会更方便。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:4)

我想我明白这意味着该项目没有被放入getopt组......它留在ARGV中,就像其他一切一样......为什么要修改ARGV?

更新 eww。在对文档中的示例进行一些实验之后,在opts.each运行之前,它不会从ARGV中删除项目......看起来删除是在opts中访问项目的副作用。

非常糟糕的形式。 :(