2010-08-12 117 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