我有以下列表
["txtvers=1","userid=3A6524D4-E31C-491D-94DD-555883B1600A","name=Jarrod Roberson","version=2"]
我想创建一个Dict,其中=的左边是键,右边是值。 优选地,键是原子。
使用以下列表理解我得到了这个。
KVL = [string:tokens(T,"=") || T <- TXT].
[["txtvers","1"], ["userid","3A6524D4-E31C-491D-94DD-555883B1600A"], ["name","Jarrod Roberson"], ["version","2"]]
我现在正在努力的是如何将嵌套列表转换为元组,以便将它们发送到元组列表中 我可以将它们发送到dict:from_list
我想要的是这样的
[{txtvers,"1"}, {userid,"3A6524D4-E31C-491D-94DD-555883B1600A"}, {name,"Jarrod Roberson"}, {version,"2"}]
我知道必须有一个简洁的方法来做到这一点,但我无法理解它。
答案 0 :(得分:4)
KVL = [begin [K,V]=string:tokens(T,"="), {list_to_atom(K), V} end || T <- L].
)
答案 1 :(得分:2)
对于从这个问题中提示的其他人的一点免责声明。使用list_to_existing_atom将列表转换为原子总是一个好主意。
split_keyvalue(Str) ->
try
{K, [$=|V]} = lists:splitwith(fun(X) -> X =/= $= end, Str),
{erlang:list_to_existing_atom(K), V}
catch
error:badarg ->
fail
end.
split_keyvalues(List) ->
[KV || {_,_}=KV <- lists:map(fun split_keyvalue/1, List)].
原因在于,如果(恶意)用户提供的数据可以创建数百万和数百万个独特原子,则可能是DoS攻击。唯一原子表最大可达1600万个原子。
此外,令牌会在字符串中分割每个等号。不仅仅是在第一个分裂上更好吗?
答案 2 :(得分:1)
我终于让它终于工作了!
A = [ string:tokens(KV,"=") || KV <- TXT].
[["txtvers","1"],
["userid","3A6524D4-E31C-491D-94DD-555883B1600A"],
["name","Jarrod Roberson"],
["version","2"]]
B = [{list_to_atom(K),V} || [K|[V|_]] <- A].
[{txtvers,"1"},
{userid,"3A6524D4-E31C-491D-94DD-555883B1600A"},
{name,"Jarrod Roberson"},
{version,"2"}]
答案 3 :(得分:1)
更短:
KVL = [{list_to_atom(K), V} || [K,V] <- [string:tokens(T,"=") || T <- L]].