将ARGV拆分为两个文件列表

时间:2014-10-20 12:48:43

标签: ruby optparse optionparser

我正在使用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
    
  3. 有更优雅的方式来实现它吗?

1 个答案:

答案 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 --.