如何以编程方式从Julia中的字符串标识符定义变量?

如何以编程方式从Julia中的字符串标识符定义变量?,julia,metaprogramming,Julia,Metaprogramming,我想将abc.conf文件中的字符串设置为变量名称,例如,ProductNo,ProdName 这是否可行 abc.conf: ProductNo=>//ProductNo ProdName=>//ProdName ProdClass=>//ProdClass ProdLimit=>//ProdLimit ProdProfit=>//ProdProfit ProdYildType=>//ProdYildType PrdYildTypeOrder=>//PrdYildTypeOrder ProdA

我想将
abc.conf
文件中的字符串设置为变量名称,例如,
ProductNo
ProdName

这是否可行

abc.conf

ProductNo=>//ProductNo
ProdName=>//ProdName
ProdClass=>//ProdClass
ProdLimit=>//ProdLimit
ProdProfit=>//ProdProfit
ProdYildType=>//ProdYildType
PrdYildTypeOrder=>//PrdYildTypeOrder
ProdArea=>//ProdArea
szComDat=>//szComDat
ProdSaleDate=>//ProdSaleDate
IsCanBuy=>//IsCanBuy
PurStarAmo=>//PurStarAmo
RowNumber=>//RowNumber
朱莉娅·朗:

使用LibExpat
使用请求
url=”http://ewealth.abchina.com/app/data/api/DataService/BoeProductV2?i=1&s=1500&o=0&w=%25E5%258F%25AF%25E5%2594%25AE%257C%257C%257C%257C%257C%257C%257C1%257C%257C0%257C%257C0"
xdoc=xp_parse(readstring(get(url)))
函数ABC()
打开(“abc.conf”、“r”)do f
对于每条线中的行(f)
xml=拆分(第“=>”行)
#MethodError:无法将数组{LibExpat.ETree,1}类型的对象`转换'为子字符串{String}类型的对象
xml[1]=LibExpat.find(xdoc,xml[2])
println(产品编号)
结束
关闭(f)
结束
结束
ABC()

是!这在朱莉娅身上是可行的。可以这样做,注意不要悄悄地覆盖标识符:

使用LibExpat:ETree,xp\u parse
使用请求:获取
const xp_find=LibExpat.find
函数进程\u xpdoc\u config(前缀::String,配置::String,xp\u doc::ETree)::Dict{String,Vector{ETree}
dict=dict{String,Vector{ETree}}()
打开(配置)do文件
对于每个hline(文件)中的行
如果!isempty(行)
xml=拆分(第“=>”行)
如果长度(xml)==2
标识符=符号(xml[1])
前缀\标识符=符号(大写字母(前缀),“\”,标识符)
value=xp\u find(xp\u文档,xml[2])
如果!已定义(前缀为_标识符)
@eval$前缀_标识符=$值
信息(“定义的$prefixed_标识符”)
其他的
警告(“$prefixed_标识符已定义!”)
结束
推(dict,字符串(标识符)=>值)
结束
结束
结束
结束
返回指令
结束

url=”http://ewealth.abchina.com/app/data/api/DataService/BoeProductV2?i=1&s=1500&o=0&w=%25E5%258F%25AF%25E5%2594%25AE%257C%257C%257C%257C%257C%257C%257C1%257C%257C0%257C%257C0"
xp|u doc=get(url)|>readstring |>xp|u parse
abc_conf=“abc.conf”
前缀=“abc”

使用带有
@eval
julia>ABC=process\u xpdoc\u config(前缀,ABC\u conf,xp\u doc)
警告:ABC\U产品编号已定义!
信息:已定义的ABC\U ProdName
信息:已定义的ABC\U ProdClass
信息:定义的ABC\U产品限制
信息:定义的ABC\U产品利润
信息:定义的ABC\U产品类型
信息:已定义的ABC\U PrdYildTypeOrder
信息:已定义的ABC\U生产区
信息:已定义的ABC_szComDat
信息:定义的ABC\U产品销售日期
信息:定义的ABC\u IsCanBuy
信息:已定义的ABC_PurStarAmo
信息:定义的ABC\U行数
Dict{String,数组{LibExpat.ETree,1}},包含13个条目:
“ProdLimit”=>LibExpat.ETree[360天…
“ProdSaleDate”=>LibExpat.ETree[18.01.12-18.01…
“RowNumber”=>LibExpat.ETree[1,LibExpat.ETree[50000.00 LibExpat.ETree[非保本浮动收益…
“szComDat”=>LibExpat.ETree[2018.01.12 LibExpat.ETree[4.95%LibExpat.ETree][全国发行 LibExpat.ETree[1,LibExpat.ETree[封闭,…
“ProductNo”=>LibExpat.ETree[AD180022⋮
julia>ABC[“产品编号”][1]
AD180022

最终,您需要使用
eval
/
@eval
或定义一个新的宏来生成代码,而不使用
eval
,即:

宏过程\u xpdoc\u配置(前缀::String,配置::String,xp\u doc::Symbol)
_进程\u xpdoc\u配置(前缀,配置,xp\u doc)
结束
函数(进程)xpdoc(配置)(前缀::字符串,配置::字符串,xp(文档)符号)::Expr
block=Expr(:block)
push!(block.args,:(dict=dict{String,Vector{ETree}}())
打开(配置)do文件
对于每个hline(文件)中的行
如果!i空(行)
xml=拆分(第“=>”行)
如果长度(xml)==2
标识符=符号(xml[1])
前缀\标识符=符号(大写字母(前缀),“\”,标识符)
if!已定义(前缀为_标识符)
push!(block.args,esc(:($prefixed\u identifier=xp\u find($xp\u doc,$xml[2]))
info\u str=字符串(“已定义”,前缀为\u标识符)
推!(block.args,:(info($info_str)))
其他的
警告\u str=string(前缀为\u标识符,“已定义!”)
推!(block.args,:(warn($warn_str)))
结束
push!(block.args,:(push!(dict,string($(Meta.quot(identifier))=>xp\u find($xp\u doc,$xml[2]))
结束
结束
结束
结束
推!(block.args,:(dict))
返回块
结束

不带
eval的用法宏
julia>DEF_ProdName=7
7.
julia>DEF=@process\u xpdoc\u config(“DEF”、“abc.conf”、xp\u doc)
信息:已定义的DEF_产品编号
警告:DEF_ProdName已定义!
信息:已定义的DEF_ProdClass
信息:定义的DEF_产品限制
信息:定义的定义产品利润
信息:已定义的DEF_PRODYLDTYPE
信息:已定义的定义类型顺序
信息:已定义的DEF_产品区域
信息:已定义定义的DEF_szComDat
信息:已定义的DEF_ProdSaleDate
信息:已定义定义的DEF_IsCanBuy
信息:已定义的定义
信息:定义的定义行数
Dict{String,数组{LibExpat.ETree,1}},包含13个条目:
“ProdLimit”=>LibExpat.ETree[360天 LibExpat.ETree[18.01.12-1…
“RowNumber”=>LibExpat.ETree[1…
“PurStarAmo”=>LibExpat.ETree[50000.00 LibExpat.ETree[非保本浮动…
“szComDat”=>LibExpat.ETree[2018.01.12 LibExpat.ETree[4]