2010-08-12 120 views
3

嗨,这是我的第一篇文章,希望你们一切都好。所以我只是开始erlang,我遇到了一个问题,我不知道如何解决。ERLANG - 将列表拆分成子列表

所以我有一个二进制我在

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

我的目标形式recieving是基于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

回答

8

与R14A的到来,现在二郎包括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 
+1

+1 I love Erlang – 2010-08-12 02:54:47

+0

非常感谢! – BAR 2010-08-12 05:08:21