我正在获取一个保存为字符串的列表,并尝试解析它以供使用。我可以使用 Meta.parse 将字符串转换为表达式:
li = db.list
print(typeof(d[1]),d[1])
>> String
["apple", "banana", "coconut"]
parsed_li = Meta.parse(d[1])
print(typeof(parsed_li), parsed_li)
>> Expr
["apple", "banana", "coconut"]
但我似乎不能像普通列表一样使用它;例如,使用普通列表,我可以通过索引访问元素,但无法访问 Expr 对象的索引:
normal_li = ["apple", "banana", "coconut"]
print(normal_li[1])
>> apple
print(parsed_li[1])
>>
MethodError: no method matching getindex(::Expr, ::Int64)
Stacktrace:
[1] top-level scope at In[214]:8
我一直在修补,不确定我在这里缺少什么!
最佳答案
依赖 Meta.parse()
解析您的输入数据既低效又不安全(恶意代码总是可以插入到输入数据中,您可能会执行 eval
等等)。您宁愿使用专门为此设计的工具。在您的情况下,请注意此数据可以被视为有效的 JSON 格式,并且可以按如下方式读取:
julia> str = """["apple", "banana", "coconut"]"""
"[\"apple\", \"banana\", \"coconut\"]"
julia> using JSON3
julia> JSON3.read(str)
3-element JSON3.Array{String, Base.CodeUnits{UInt8, String}, Vector{UInt64}}:
"apple"
"banana"
"coconut"
julia> collect(JSON3.read(str))
3-element Vector{String}:
"apple"
"banana"
"coconut"
如果您信任输入数据(通常您永远不应该),您可以采用不安全的方式进行操作:
julia> eval(Meta.parse(str))
3-element Vector{String}:
"apple"
"banana"
"coconut"
如果您想在不使用 eval
的情况下提取信息,可以使用 Expr
对象的 args
字段来完成 - 但是它的方式每次的处理都强烈依赖于数据结构:
julia> Meta.parse(str).args
3-element Vector{Any}:
"apple"
"banana"
"coconut"
关于julia - 将 Julia 表达式转换为数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69693295/