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

Привет, это мой первый пост, надеюсь, у вас все хорошо. Так что я только начинаю erlang, и я столкнулся с проблемой, я не знаю, как ее решить.

Итак, у меня есть двоичный файл, который я получаю в виде

<<56, 23, 67, 34, 45, 78, 01, 54, 67, 87, 45, 53, 01, 34, 56, 78>>

Моя цель - разбить его на подсписок (или двоичный, если он более эффективен) на основе 01.

Например, вышеприведенное должно выглядеть примерно так:

<<56, 23, 67, 34, 45, 78>> <<54, 67, 87, 45, 53>> <<34, 56, 78>>

-или-

[[56, 23, 67, 34, 45, 78], [54, 67, 87, 45, 53], [34, 56, 78]]

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.

Это не совсем чисто и совсем не похоже на то, что пишут профессионалы. Я уверен, что я чмокаю головой "дух", когда кто-то подсказывает мне.

Я понимаю, что определенно существует более одного решения, но какое ЛУЧШЕЕ. Кажется, у ERL так много BIF и способов сделать что-то, просто я должен найти свой путь, я думаю.

Спасибо за помощь, ребята -B

1 Ответ

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

В дополнение к 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">>]

Обратите внимание, что, хотя это выглядит неправильно (<<"6CW-5">> и <<"\"8N">>), базовое представление является правильным, и строки - это виртуальная машина, пытающаяся выяснить, как распечатать двоичные файлы. Смотрите тот же вызов при выводе в необработанном формате:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...