将ARGV拆分为两个文件列表



我正在使用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
    

有没有一种更优雅的方式来实现它?

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

您可以定义两个单独的选项,每个选项都接受一个数组,或者,您可以定义一个接受数组,另一个来自OptionParser完成其parse!过程后的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—表示选项结束,并禁用进一步的选项处理。在--被视为文件名和参数。-的自变量相当于--。

最新更新