2011-10-24 129 views
-1

我有以下几点:如何在ARGV命令行参数中传递数组?

===我的程序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

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

节目 “other.rb”我想打印它像这样:

fda ok ok 
asdf no nok 

但它是打印如下:

foo 
dkk 
ano 
aok 
sk 
d 
f 

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

+0

这功课吗?参数和你想要做的事情似乎比实际更具学术性。 –

回答

0

你可以使用Thor这是一个用于创建命令行应用程式DSL

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,我得到了这个结果wh我运行你的代码:

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}")不会做你认为它做的事情。以下是发送到子shell的实际命令查找时system过程它像:

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.eachAND了解为什么它是首选而不是for
  • 您不需要使用to_s,因为您已经在处理字符串和字符。
+0

感谢您的帮助! – user1000622