我使用 Redis数据库通过 eredis客户端将数据存储在 Erlang 中。我的一个输出是<<"{{1391,764334,959623},<0.437.0>}">>
现在我需要将上面的输出转换为[{{1391,764334,959623},<0.437.0>}]
。但我无法得到它。我跟着一些代码,
String = "[1,2,3].",
{ok, Ts, _} = erl_scan:string(String),
{ok, Term} = erl_parse:parse_term(Ts),
和
D = binary_to_list(Data),
{ok, Tokens, _} = erl_scan:string(D ++ "."),
{ok, Term} = erl_parse:parse_term(Tokens),
以上代码适用于其他字符串。但是我没有得到这个字符串格式"{{1391,764334,959623},<0.437.0>}"
答案 0 :(得分:2)
当您在shell或错误报告中看到<0.437.0>
等括号内的内容时,它只是某些数据的表示(Pids,Sockets,Ports,Funs,...)。
Erlang甚至没有 lexe / scan 这个角度括号的东西。在将数据传递给 erl_parse 之前,您需要处理数据。
你可以做的就是把这些事情串起来:<0.437.0>
→"<0.437.0>"
答案 1 :(得分:1)
使用各种binary
函数的解决方案:
B = <<"{{1391,764334,959623},<0.437.0>}">>.
F = binary:replace(B,[<<"{">>, <<"}">>], <<"">>, [global]). % Flatten the structure
[T1,T2,T3,PidBin] = binary:split(F, <<",">>, [global]).
Result = [{{binary_to_integer(T1),
binary_to_integer(T2),
binary_to_integer(T3)},
list_to_pid(binary_to_list(PidBin))}].
这方面的一个潜在问题是,如果您以字符串格式存储外部pid,list_to_pid
如果您尝试转换字符串“&lt; 1.232.0&gt;”则会引发异常(外部pid)到进程标识符。
答案 2 :(得分:0)
也许你可以使用re。
B= <<"{{1391,764334,959623},<0.437.0>}">>.
L = binary:bin_to_list(B).
[_, _, T1, T2, T3, _, PidStr, _] = re:split(L, "[{,}]", [{return, list}]).
Res = [{{list_to_integer(T1), list_to_integer(T2), list_to_integer(T3)}, list_to_pid(PidStr)}].