在Erlang中从字符串转换

时间:2014-02-09 11:26:33

标签: erlang redis

我使用 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>}"

的预期输出

3 个答案:

答案 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)}].