代码之家  ›  专栏  ›  技术社区  ›  nmichaels

字符串版本的term_to_binary

  •  2
  • nmichaels  · 技术社区  · 14 年前

    我正在尝试编写一个简单的服务器,通过tcp与客户机对话。我让它发送消息很好,但现在我希望它将消息解释为Erlang数据类型。例如,假设它类似于HTTP(不是),并且我想从客户端发送 {get, "/foo.html"}

    我可能会用 term_to_binary binary_to_term ,但是调试基于文本的协议要容易得多,所以我希望找到一个更适合列表的版本。有人藏在什么地方吗?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Tadmas    14 年前

    可以将字符串解析为表达式(类似于 file:consult )通过:

    % InputString = "...",
    {ok, Scanned, _} = erl_scan:string(InputString),
    {ok, Exprs} = erl_parse:parse_exprs(Scanned),
    {value, ParsedValue, _} = erl_eval:exprs(Exprs, [])
    

    (见 http://www.trapexit.org/String_Eval )

    你应该可以使用 io_lib:format 使用 ~w ~p 格式代码,例如 io_lib:format("~w", [{get, "/foo.html"}])

    我不认为这会很快,所以如果性能是一个问题,你可能不应该使用这样的字符串。

    erl_parse:parse_exprs 以确保它包含您感兴趣的格式(即,它始终是{atom(),list()}的元组),而没有嵌入函数调用。你应该能够通过模式匹配做到这一点。