0

我正在使用 Ruby OptionParser 但无法弄清楚如何将非选项参数作为两个列表获取。

myscript --option-one --option-two file1 file2 -- file10 file11

有没有办法从 OptionParser 分别获取两个文件列表?

[file1, file2]
[file10, file11]

我不在乎它们中的哪一个保留在 ARGV 中,只想分别有两个列表以将它们提交给不同的处理。

我目前的解决方案是

  1. 添加--如下处理程序

    opts.on('--', 'marks the beginning of a different list of files') do
       ARGV.unshift(:separator)
    end
    

    这将产生具有以下内容的 ARGV

    [ file1, file2, :separator, file10, file11 ]

  2. 然后,在 OptionParser 之外并在parse!被调用之后,我修改ARGV

    list1 = ARGV.shift(ARGV.index(:separator))
    ARGV.shift
    

有没有更优雅的方式来完成它?

4

1 回答 1

0

您没有正确使用 OptionParser。它能够为您创建数组/列表,但您必须告诉它您想要什么。

parse!您可以定义两个单独的选项,每个选项都接受一个数组,或者,您可以定义一个接受一个数组,另一个在 OptionParser 完成其传递后来自 ARGV 。

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 -- 表示选项结束并禁用进一步的选项处理。-- 之后的任何参数
          被视为文件名和参数。- 的参数等价于 --。
于 2014-10-20T14:11:30.580 回答