2010-10-21 36 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

相關問題