2011-10-24 58 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