ERlANG - 将列表拆分为子列表

时间:2010-08-12 05:18:22

标签: binary erlang list

所以我只是在我的另一篇文章中由一个好人解决了一个问题。

ERLANG - Splitting Lists into sub list

现在我是Erlang的初学者,需要一些帮助来解决另一个函数的语法,该函数对我上一篇文章的结果起作用。

例如,我现在有:

   Reply = [<<56,45,34,07,45,67,34>>, <<12,23,56,07,67,67>>,  <<55,23,45,07,89,56>>]

我需要将其进一步分解为:

[ [<<56,45,34>>,<<45,67,34>>], [<<12,23,56>>,<<67,67>>] ,  [<<55,23,45>>, <<89,56>>]  ]

此示例中的分隔符是&lt;&lt;&lt;&gt;&gt;

此代码进程是二进制文件

parse(Reply) -> binary:split(Reply, <<07>>, [global]).

但是现在我怎么能递归地遍历数组并再次进行。

以下是我当前代码的示例:

parse(Reply) -> binary:split(Reply, <<01>>, [global]).
parse2(Reply) -> binary:split(Reply, <<07>>, [global]).

func1(Done) -> [parse2(X) || X <- Done].

%%blah blah - get to the executing functions code
Done = parse(Reply),
Done1 = func1(Done),

我知道它必须是最后一个确定有我的超级简单。

最佳, -B

2 个答案:

答案 0 :(得分:1)

使用列表推导将函数应用于列表的每个元素。该功能与您上一个问题几乎相同:

1> L = [<<56,45,34,07,45,67,34>>, <<12,23,56,07,67,67>>,  <<55,23,45,07,89,56>>].
[<<56,45,34,7,45,67,34>>,
 <<12,23,56,7,67,67>>,
 <<55,23,45,7,89,56>>]
2> [binary:split(X, <<07>>, [global]) || X <- L].
[[<<"8-\"">>,<<"-C\"">>],
 [<<12,23,56>>,<<"CC">>],
 [<<55,23,45>>,<<"Y8">>]]
3> io:format("~w~n",[[binary:split(X, <<07>>, [global]) || X <- L]]).
[[<<56,45,34>>,<<45,67,34>>],[<<12,23,56>>,<<67,67>>],[<<55,23,45>>,<<89,56>>]]
ok

另一个选择是使用列表:map / 2:

4> lists:map(fun(X) -> binary:split(X, <<07>>, [global]) end, L).
[[<<"8-\"">>,<<"-C\"">>],
 [<<12,23,56>>,<<"CC">>],
 [<<55,23,45>>,<<"Y8">>]]

答案 1 :(得分:0)

想出来,请随时告诉我,如果有更有效的方式 - 或 - 只是你的方式,我毕竟是在学习。

parse(Reply) -> binary:split(Reply, <<01>>, [global]).
parse2(<<>>) -> <<>>;
parse2(Reply) -> binary:split(Reply, <<"=">>, [global]).

func2([H|T], Result) ->
    H1 = parse2(H), 
    func2(T, [H1|Result]);
func2([], Result) -> io:format("Reply 1 = ~p~n", [Result]), Result.


Done = parse(Reply),

Done1 = func2(Done, []),

-B