BAR*_*BAR 3 erlang recursion parsing list
嗨,这是我的第一篇文章,希望大家都好.所以我刚刚开始erlang,我遇到了一个问题,我不确定如何解决.
所以我有一个我正在接受的二进制文件
<<56, 23, 67, 34, 45, 78, 01, 54, 67, 87, 45, 53, 01, 34, 56, 78>>
Run Code Online (Sandbox Code Playgroud)
我的目标是根据01将其拆分为子列表(如果效率更高,则为二进制).
例如,上面应该看起来像:
<<56, 23, 67, 34, 45, 78>> <<54, 67, 87, 45, 53>> <<34, 56, 78>>
Run Code Online (Sandbox Code Playgroud)
-要么-
[[56, 23, 67, 34, 45, 78], [54, 67, 87, 45, 53], [34, 56, 78]]
Run Code Online (Sandbox Code Playgroud)
01是分隔标记,不需要包含在最终输出中.
我尝试过这样的事情:(如果有更好的方法,请不要理会)
parse1([]) -> [];
parse1(1) -> io:format("SOHSOHSOHSOHSOHSSOHSOHS");
parse1(Reply) -> parse1({Reply, []});
parse1({Reply, nxtParse}) ->
[H | T] = Reply,
case H of
_ when H > 1 ->
[H | nxtParse],
io:format("Reply 1 = ~p~n", [H]),
parse1({T, nxtParse});
_ when H == 1 ->
io:format("SOHSOHSOHSOHSOHSSOHSOHS");
[] ->
ok
end.
Run Code Online (Sandbox Code Playgroud)
这根本不是很干净,根本不像专业人士的写作.我确定当有人告诉我时,我会打我的头"呃".
我意识到肯定有不止一个解决方案,但最好的解决方案是什么.似乎ERL有很多BIF和做事的方式,我想要找到自己的方式.
谢谢你们的帮助-B
与R14A一起,Erlang现在包含一个binary处理此类任务的模块:
1> Bin = <<56, 23, 67, 34, 45, 78, 01, 54, 67, 87, 45, 53, 01, 34, 56, 78>>.
<<56,23,67,34,45,78,1,54,67,87,45,53,1,34,56,78>>
2> binary:split(Bin, <<01>>, [global]).
[<<56,23,67,34,45,78>>,<<"6CW-5">>,<<"\"8N">>]
Run Code Online (Sandbox Code Playgroud)
请注意,虽然它看起来不对(<<"6CW-5">>和<<"\"8N">>),但底层表示是正确的,字符串是VM试图弄清楚如何打印出二进制文件.以原始格式输出时看到相同的调用:
3> io:format("~w~n", [binary:split(Bin, <<01>>, [global])]).
[<<56,23,67,34,45,78>>,<<54,67,87,45,53>>,<<34,56,78>>]
ok
Run Code Online (Sandbox Code Playgroud)