2010-10-21 42 views
2

我正在尝试编写一个简单的服务器,通过tcp与客户端通信。我让它发送消息很好,但现在我希望它将消息解释为Erlang数据类型。例如,假装它类似于HTTP(不是),并且我想从客户端发送{get, "/foo.html"}并让服务器将其解释为包含原子和列表的元组,而不仅仅是一个大的列表或二进制文件。term_to_binary的字符串版本

我可能最终会使用term_to_binarybinary_to_term,但是调试基于文本的协议要容易得多,因此我希望能找到更适合列表的版本。有没有人躲在某个地方?

回答

4

您可以通过解析一个字符串表达式(类似于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()})的一个元组,并且没有嵌入的函数调用。你应该可以通过模式匹配来做到这一点。

+0

这正是我一直在寻找的。这是为了调试和开发,所以性能几乎不成问题。谢谢。 – nmichaels 2010-10-21 17:35:12

相关问题