передача массива в качестве аргумента команды - PullRequest
3 голосов
/ 08 марта 2012

Я пытаюсь передать массив в скрипт 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

Как видите, массив передается в виде строки и обр[0] в основном печатает значение ascii.

Итак, вопрос в том, как передать массив из командной строки, надеюсь, в одну строку.Также я считаю, что этот вопрос относится ко всем вызовам оболочки, кроме просто ruby?

Я использую оболочку bash.

Обновление: просто обновил вопрос, чтобы указать, что в разных позициях может быть несколько массивов

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

Аргументы всегда будут представлены в виде строки, вам нужно найти способ превратить их в нужный формат, в вашем примере это массив значений, за которым следует одно значение. Я предлагаю использовать 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 голосов
/ 08 марта 2012

Вот список способов сделать это.Держитесь подальше от 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 голосов
/ 08 марта 2012

Вы можете использовать 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

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...