2015-06-08 3 views
2

Мне нужно сделать что-то вроде этого < < «Некоторый текст в двоичном формате» >>, и он должен вернуться < < «Некоторые»>. Как я могу сделать это без функции split, только путем сопоставления шаблонов и выбора/if случаев с Erlang. Спасибо.Первое слово бинарной строки erlang

+0

что ваше правило находки? – BlackMamba

+0

@ user2513522, возьмите основу ответа отсюда: http://stackoverflow.com/questions/428124/how-can-i-split-a-binary-in-erlang –

ответ

4

Хотя Attic «s approach правильно, есть простое решение (в том числе обрезка ведущих пробелов):

first_word_bin(Bin) -> 
    first_word_bin(ltrim(Bin), <<>>). 

first_word_bin(<<>>, Acc) -> Acc; 
first_word_bin(<<$\s, _/binary>>, Acc) -> Acc; 
first_word_bin(<<X, Bin/binary>>, Acc) -> 
    first_word_bin(Bin, <<Acc/binary, X>>). 

ltrim(<<$\s, Bin/binary>>) -> ltrim(Bin); 
ltrim(Bin) -> Bin. 
+0

Да, это намного лучше – Attic

1

Не знаете, почему вы не хотели бы использовать двоичный код: split. Вот one метод достижения этого, но мне это не очень нравится.

first_word_bin(Bin) -> 
    Len = length_till_space(Bin, 0), 
    <<Bin:Len/binary>>. 

length_till_space(<<>>, Num) -> Num; 
length_till_space(<<$\s, _/binary>>, Num) -> Num; 
length_till_space(<<_:1/binary, Tl/binary>>, Num) -> 
    length_till_space(Tl, Num + 1). 

Однако, если двоичный код имеет пробел в начале, например.

< < "Некоторый текст в двоичный" >>

тогда результат будет < < >>, без места на старте будет < < "Некоторые" >>. Это можно устранить, предварительно обрезая начальные пробелы, но вы можете использовать тот же метод.

Поэтому мы используем length_till_space, чтобы получить количество символов, пока оно не достигнет пробела. Первый случай проверяет, является ли двоичный код пустым, второй регистр проверяет, является ли глава двоичного файла $ \ s (пробелом), а последний случай просто выполняет вызов хвоста и увеличивает число.

Затем, наконец, мы просто получаем первое количество символов из двоичного кода и возвращаем его.

Смежные вопросы