我正在使用Ruby OptionParser,但无法弄清楚如何将非选项参数作为两个列表。
myscript --option-one --option-two file1 file2 -- file10 file11
有没有办法从OptionParser中分别获取两个文件列表?
[file1, file2]
[file10, file11]
我不在乎它们中的哪一个留在ARGV中,只是想分别有两个列表来提交它们进行不同的处理。
我目前的解决方案是
添加--
的处理程序如下
opts.on('--', 'marks the beginning of a different list of files') do
ARGV.unshift(:separator)
end
这会产生具有以下内容的ARGV
[ file1, file2, :separator, file10, file11 ]
然后,在OptionParser之外,在调用parse!
之后,我修改了ARGV
list1 = ARGV.shift(ARGV.index(:separator))
ARGV.shift
有更优雅的方式来实现它吗?
答案 0 :(得分:0)
您没有正确使用OptionParser。它有能力为你创建数组/列表,但你必须告诉它你想要什么。
您可以定义两个单独的选项,每个选项都接受一个数组,或者,您可以定义一个接受数组的选项,另一个选项来自ARGV后OptionParser完成其parse!
传递。
require 'optparse'
options = {}
OptionParser.new do |opt|
opt.on('--foo PARM2,PARM2', Array, 'first file list') { |o| options[:foo] = o }
opt.on('--bar PARM2,PARM2', Array, 'second file list') { |o| options[:bar] = o }
end.parse!
puts options
保存并运行:
ruby test.rb --foo a,b --bar c,d
{:foo=>["a", "b"], :bar=>["c", "d"]}
或者:
require 'optparse'
options = {}
OptionParser.new do |opt|
opt.on('--foo PARM2,PARM2', Array, 'first file list') { |o| options[:foo] = o }
end.parse!
puts options
puts 'ARGV contains: "%s"' % ARGV.join('", "')
保存并运行:
ruby test.rb --foo a,b c d
{:foo=>["a", "b"]}
ARGV contains: "c", "d"
您无需定义--
。 --
由shell处理,而不是脚本。这来自man sh
:
-- A -- signals the end of options and disables further option processing. Any arguments after the -- are treated as filenames and arguments. An argument of - is equivalent to --.