ERlANG - Разделение списков на подсписки - PullRequest
1 голос
/ 12 августа 2010

Итак, одна моя проблема была очень быстро решена одним парнем из моего другого поста.

ERLANG - Разделение списков на подсписок

Теперь яновичок в 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>>]  ]

Разделитель в этом примере: << 07 >>

Этот процесс кода является двоичным

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),

Я знаю, что это должно быть что-то сверхпростое, которое наверняка имел последнийя.

Best, -B

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Используйте списочные выражения, чтобы применить функцию к каждому элементу списка.Функция почти такая же, как и для вашего последнего вопроса:

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">>]]
0 голосов
/ 12 августа 2010

Понял, пожалуйста, не стесняйтесь, дайте мне знать, если есть более эффективный способ - или - просто ваш путь, я учусь в конце концов.

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

...