2012-03-08 49 views
3

我想從命令行傳遞一個數組的Ruby腳本和麪臨的一些問題。傳遞數組作爲命令的參數

這裏的問題是:

require 'pp' 

def foo(arr1, var, arr2, var2) 
    puts arr1.class 
    pp arr1 
    pp arr1[0] 
    puts arr2.class 
    pp arr2 
    pp arr2[0] 
end 

foo [1, 2], 3, [5, 6], 8 

這裏是輸出:

Array 
[1, 2] 
1 
Array 
[5, 6] 
5 

一切都很好至今。現在,我改變我的腳本命令行接受的說法:

require 'pp' 

def foo(arr1,var) 
    puts arr1.class 
    pp arr1 
    pp arr1[0] 
end 
foo ARGV[0],3 

這裏是輸出:

jruby test.rb [1, 2], 3, [5, 6], 8 
String 
"[1," 
91 
String 
"2]," 
50 

正如你所看到的,數組被作爲字符串傳遞和ARR [0]基本上打印ascii值。

所以,問題是怎樣在一個行中傳遞的陣列從所述命令行中,有希望。 另外我相信這個問題與所有shell調用相關,而不僅僅是ruby?

我使用bash shell的。

更新: 剛剛更新的問題表明,可以在不同的位置

回答

0

您可以使用eval雖然你可能會打開一個安全漏洞:

require 'pp' 

def foo(arr1, var, arr2, var2) 
    puts arr1.class 
    pp arr1 
    pp arr1[0] 
    puts arr2.class 
    pp arr2 
    pp arr2[0] 
end 

eval("foo " + ARGV.join(" ")) 

結果

Array 
[1, 2] 
1 
Array 
[5, 6] 
5 

希望它可以幫助

+0

Thanx Edu。我傳遞的數組是一組字符串,文件路徑是特定的。真的很感激,如果你能給出正確的語法來傳遞字符串數組,這樣的:JRuby的test.rb [「路徑1」,「路徑2」],3,[「NAME1」,「NAME2」],8 – codeObserver 2012-03-08 18:41:19

+0

添加「 jruby test.rb [\「path1 \」,\「path2 \」],3,[\「name1 \」,\「name2 \」],8 .. Thnx,這對我很有用! – codeObserver 2012-03-08 19:09:05

+0

嗨codeObserver,你可以在EVAL改成這樣: 的eval( 「富」 + ARGV.join(」「).gsub(/(\ w +)/ ' 「\ 1」')),所以你不如果你想要的話,需要跳過傳遞參數 – Edu 2012-03-08 21:53:53

2

是多個陣列下面的方法來完成這個list。遠離基於eval的解決方案。我最喜歡的(雖然我不知道紅寶石,但是這是我最喜歡的:

irb(main):001:0> s = "[5,3,46,6,5]" 
=> "[5,3,46,6,5]" 
irb(main):002:0> a = s.scan(/\d+/) 
=> ["5", "3", "46", "6", "5"] 
irb(main):003:0> a.map!{ |s| s.to_i } 
=> [5, 3, 46, 6, 5] 
+0

日Thnx。基督徒。我試圖從shell中調用它而不是irb。看起來像eval是唯一的選擇.. – codeObserver 2012-03-08 08:56:18

+0

那麼,你可以使用最後兩行代碼來實現這一點,因爲你得到它作爲一個字符串。 – 2012-03-08 22:04:33

2

的爭論總會來作爲字符串,你需要找到一個辦法把他們變成你想要的格式,在你例如值的數組,我建議使用trollop這一點,其次是單個值取繁重了處理參數的,可以接受多值參數,如

require 'trollop' 

opts = Trollop.options do 
    opt :array, 'an array', type: :ints 
    opt :val, 'a value', type: :int 
end 

puts "array: #{opts[:array].inspect}" 
puts "val: #{opts[:val].inspect}" 

然後你就可以這樣做:

$ ruby test.rb -a 1 2 -v 3 
array: [1, 2] 
val: 3 

和額外的不錯:

$ ruby test.rb --help 
Options: 
--array, -a <i+>: an array 
--val, -v <i>: a value 
--help, -h: Show this message 
+0

Thnx Jon。這看起來像一個有趣的選項。不過,我得到一些語法錯誤,文檔沒有清楚地解釋我的選擇。 ==========語法錯誤,意外的':' opt:array,'an array',type :: ints =========。此外,我更新了我的問題以使其更清晰 – codeObserver 2012-03-08 08:33:43

+0

@codeObserver:您正在使用舊版本的Ruby。新的哈希語法是在Ruby 1.9.0中引入的。 – 2012-03-08 10:06:38