2

tcpを介してクライアントと通信する単純なサーバーを作成しようとしています。私はそれでメッセージをうまく送信していますが、今はメッセージをErlangデータ型として解釈したいと思っています。たとえば、HTTPに似ている(そうではない)と偽って、クライアントから送信し{get, "/foo.html"}、サーバーに、大きなリストやバイナリではなく、アトムとリストを含むタプルとして解釈させたいとします。

おそらくとを使用することterm_to_binarybinary_to_termなりますが、テキストベースのプロトコルのデバッグは非常に簡単なので、よりリストに適したバージョンを見つけたいと思っていました。どこかに隠れている人はいますか?

4

1 に答える 1

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~pio_lib:format("~w", [{get, "/foo.html"}])

これは非常に高速になるとは思わないので、パフォーマンスが問題になる場合は、おそらくこのような文字列を使用しないでください。

また、任意の式を評価しているため、これは安全ではない可能性があることに注意してください。この方法を使用する場合は、おそらく中間出力でいくつかのチェックを行う必要があります。の結果を調べて、erl_parse:parse_exprs目的の形式が含まれていることを確認することをお勧めします (つまり、常に {atom(), list()} のタプルであり、関数呼び出しは組み込まれていません)。これは、パターン マッチングを介して実行できるはずです。

于 2010-10-21T17:28:51.860 に答える