Я думаю, что ваше текущее решение в порядке и соответствует тому, как работают многие инструменты командной строки.
Если вы действительно хотите передать весь массив как один аргумент командной строки, вам необходимо:
- каким-то образом убедиться, что оболочка правильно проанализировала его как один аргумент
- разобрать его как массив в 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