Передать вектор в качестве аргумента командной строки в Юлии - PullRequest
2 голосов
/ 19 апреля 2020

Есть ли способ передать векторную переменную в качестве аргумента командной строки в Джулию? В моем случае у меня есть два аргумента: целое число и вектор целых чисел. Хотя я легко могу разобрать первый аргумент, я не нашел приятного способа разбора вектора. Сейчас я просто установил вектор на v = parse.(Int, ARGS[2:end]), но это довольно запутанно, поскольку элементы вектора рассматриваются как аргументы. Есть ли специальный синтаксис для лечения таких случаев?

1 Ответ

5 голосов
/ 19 апреля 2020

Я думаю, что ваше текущее решение в порядке и соответствует тому, как работают многие инструменты командной строки.

Если вы действительно хотите передать весь массив как один аргумент командной строки, вам необходимо:

  1. каким-то образом убедиться, что оболочка правильно проанализировала его как один аргумент
  2. разобрать его как массив в Julia

Оба шага различаются в зависимости от синтаксиса, который вы хотите использовать.


Два примеры:

пример 1 : подобный Julia синтаксис

shell$ julia myscript.jl 42 "[1,2,3]"
i = 42
v = [1, 2, 3]

Мы можем воспользоваться преимуществом синтаксического анализатора Julia, который может анализировать такие массивы (но давайте будем осторожны с не оценивает произвольный ввод кода пользователем julia):

# First argument: an integer
i = parse(Int, ARGS[1])

# Second argument, a Vector{Int} in Julia-like format: "[1, 2, 3]"
v = let expr = Meta.parse(ARGS[2])
    @assert expr.head == :vect
    Int.(expr.args)
end

@show i
@show v


Пример 2: значения, разделенные пробелом или запятыми

shell$ julia myscript.jl 42 "1,2,3"
i = 42
v = [1, 2, 3]

Здесь мы можем использовать DelimitedFiles для разбора массива (измените разделитель на что угодно):

# First argument: an integer
i = parse(Int, ARGS[1])

# Second argument, a Vector{Int} as comma-separated values
using DelimitedFiles
v = reshape(readdlm(IOBuffer(ARGS[2]), ',', Int), :)
#                set the delimiter here ^

@show i
@show v
...