2014-10-20 95 views
0

我正在使用Ruby OptionParser,但无法弄清楚如何将非选项参数作为两个列表。将ARGV分成两个文件列表

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. ,然后,外选项ionParser和parse!被称为后,我修改ARGV

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

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

+0

这些文件如何不同,为什么你不能引入一个新的参数来处理最后两个文件。像'--option-two file1 file2 --- option-three file10 file11'。如果你需要一个分隔符,他们听起来像是一个不同的选择。 – Adam 2014-10-20 12:51:50

+0

如何告诉'OptionParser'从ARGV中删除file10和file11?我知道如何做一个单一的文件(' - 选择三FILENAME''),但不知道如何做一个未定义数量的文件 – 2014-10-20 12:56:18

回答

0

您没有正确使用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 -- 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 --. 
+0

谢谢你的回复!我知道有关数组和逗号分隔的命令行参数。这正是我想避免的。只是想知道是否有办法做到这一点。 – 2014-10-20 14:24:42

+0

尝试从ruby脚本输出ARGV,'--'会在那里。AFAIK,shell在解析它自己的参数时,如果看到'--'则停止处理。其他脚本(使用其他语言)应该达到这个规则,我知道这一点:) – 2014-10-20 14:29:18

+0

在ARGV列表中不能有空格分隔的参数,并使用OptionParser将它们收集到特定参数的选项中。选项解析器不这样做,至少没有我曾经用过的。你*可以*自己开始使用ARGV,但是你失去了他们提供的所有能力,加上你可以发现他们作者已经遇到的所有问题。 – 2014-10-20 14:42:22