如何在ARGV命令行参数中传递数组?

时间:2011-10-24 13:14:11

标签: ruby

我有以下内容:

===我的程序test.rb

def test (app, download, launch )
  for i in 0..(app.length - 1)do
    #DO SOMETHING HERE WITH THIS
    p  app[i].to_s + download[i].to_s + launch[i].to_s
  end
end
test (ARGV[0].split(//) , ARGV[2].split(//) ,ARGV[1].split(//))

===解析并执行test.rb的其他程序“other.rb”

app = ["fda","asdf"]
down =  ["ok","nok"]
la = ["ok","ok"]
system("ruby test.rb #{app} #{down} #{la}")

我想把它打印成这样的东西:

fda ok ok
asdf no nok

然而它是这样打印的:

foo 
dkk 
ano
aok
sk
d
f

如何正确地将数组传递给应用程序?

2 个答案:

答案 0 :(得分:1)

我复制了您的来源并将其粘贴到两个文件中:

test.rb:

def test (app, download, launch )
  for i in 0..(app.length - 1)do
    #DO SOMETHING HERE WITH THIS
    p  app[i].to_s + download[i].to_s + launch[i].to_s
  end
end
test (ARGV[0].split(//) , ARGV[2].split(//) ,ARGV[1].split(//))

和test2.rb:

app = ["fda","asdf"]
down =  ["ok","nok"]
la = ["ok","ok"]
system("ruby test.rb #{app} #{down} #{la}")

使用Ruby 1.9.2p290,我在运行代码时得到了这个结果:

ruby test2.rb
test.rb:7: syntax error, unexpected ',', expecting ')'
test (ARGV[0].split(//) , ARGV[2].split(//) ,ARGV[1].split(//))
                        ^
test.rb:7: syntax error, unexpected ',', expecting $end
test (ARGV[0].split(//) , ARGV[2].split(//) ,ARGV[1].split(//))

这告诉我你没有准确报告你所看到的问题。

修复语法错误会返回:

ruby test2.rb
"[[a"
"fos"
"dkd"
"a,f"
",]"

我得到的输出是我对你的代码所期望的,但它与你所说的不一样,所以我怀疑你报告的输出是否正确。当您在编写的代码和您看到的输出中寻求帮助时,请准确无误。

查看代码传递的数据显示参数为:

0 [fda,
1 asdf]
2 [ok,
3 nok]
4 [ok,
5 ok]

仅供参考,我使用这段代码代替test.rb

ARGV.each_with_index do |a, i|
  puts "#{i} #{a}"
end

我希望如此,因为system("ruby test.rb #{app} #{down} #{la}")没有按照你的想法做到。以下是system处理它时发送到子shell的实际命令:

test.rb [fda, asdf] [ok, nok] [ok, ok]

同样,这与应用程序看到它们时的参数相匹配。

要了解发生的情况,您需要阅读system的文档:

system([env,] command... [,options])    -> true, false or nil

[...]

command... is one of following forms.

[...]

  cmdname, arg1, ...          : command name and one or more arguments (no shell)

所以,system允许我们分别发送所有参数,这正是你想要的。将test2.rb更改为:

app  = %w[ fda asdf ]
down = %w[ ok  nok  ]
la   = %w[ ok  ok   ]

system(
  "echo",
  "test.rb",
  %Q["#{ app.join(',')  }"],
  %Q["#{ down.join(',') }"],
  %Q["#{ la.join(',')   }"]
)

在命令行上给我这个:

ruby test2.rb
test.rb "fda,asdf" "ok,nok" "ok,ok"

这似乎更有用。由于system的工作方式,我可以清理它并将其减少到:

app  = %w[ fda asdf ]
down = %w[ ok  nok  ]
la   = %w[ ok  ok   ]

system(
  "ruby",       # execute this
  "test.rb",    # with this script name
  app.join(','), down.join(','), la.join(',') # and these parameters
)

查看test.rb看到的内容:

ruby test2.rb
0 fda,asdf
1 ok,nok
2 ok,ok

再次,改进并更接近您的代码所期望的。

我不会完成你的代码更正,因为我怀疑这是一个家庭作业,而不是实际用途。一些提示可以帮助您:

  • 您对split的使用不正确,也不是我要放的地方。
  • 您对for的使用不是惯用的Ruby。查看Array.each AND 了解原因,而不是for
  • 您不必使用to_s,因为您已经在处理字符串和字符。

答案 1 :(得分:0)

您可以使用Thor这是一个用于创建命令行应用的dsl