我正在尝试从命令行将数组传递给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 :(得分: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]
答案 1 :(得分: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
答案 2 :(得分: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
希望有所帮助