2012-03-08 50 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