【问题标题】:Pass vector as command line argument in Julia在 Julia 中将向量作为命令行参数传递
【发布时间】:2020-08-01 11:09:34
【问题描述】:

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

【问题讨论】:

  • 您希望在命令行中调用什么语法?
  • 类似 [1,2,3]。
  • 你能把你的向量作为字符串传递吗?例如,您会调用类似 julia yourscript.jl 5 "1 2 3 4 5" 的名称。然后将脚本中的字符串解析为向量

标签: vector command-line arguments julia


【解决方案1】:

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


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

  1. 以某种方式确保它被 shell 正确解析为一个参数
  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

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2013-07-15
    • 1970-01-01
    • 2015-04-11
    • 2016-02-07
    • 2016-10-10
    • 1970-01-01
    • 2023-02-10
    • 2015-09-12
    相关资源
    最近更新 更多