我有以下内容:
===我的程序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
如何正确地将数组传递给应用程序?
答案 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