在 Julia 中将向量作为命令行参数传递

Pri*_*rgo 2 command-line arguments vector julia

有没有办法在 Julia 中将向量变量作为命令行参数传递?就我而言,我有两个参数:一个整数和一个整数向量。虽然我可以轻松解析第一个参数,但我没有找到任何令人愉快的方式来解析向量。现在我只是将向量设置为 ,v = parse.(Int, ARGS[2:end])但由于向量的项被视为参数,因此非常令人困惑。是否有一些特殊的语法来处理这种情况?

ffe*_*tte 5

我认为您当前的解决方案很好,并且符合许多命令行工具的处理方式。


如果您真的想将整个数组作为一个命令行参数传递,则必须:

  1. 以某种方式确保它被外壳正确解析为一个参数
  2. 将其解析为 Julia 中的数组

这两个步骤因您要使用的语法而异。


两个例子:

示例 1:类似 Julia 的语法

shell$ julia myscript.jl 42 "[1,2,3]"
i = 42
v = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

我们可以利用 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
Run Code Online (Sandbox Code Playgroud)


示例 2:空格或逗号分隔的值

# 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
Run Code Online (Sandbox Code Playgroud)

在这里,我们可以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
Run Code Online (Sandbox Code Playgroud)