【问题标题】:ERLANG - Splitting Lists into sub listERLANG - 将列表拆分为子列表
【发布时间】:2011-03-28 17:04:24
【问题描述】:

您好,这是我在这里的第一篇文章,希望你们一切都好。所以我刚开始使用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.

这根本不是很干净,根本不像 pro 写的。当有人提示我时,我肯定会“嗯”一下我的头。

我意识到肯定有不止一种解决方案,但最好的解决方案是什么。看来 ERL 有这么多 BIF 和做事的方法,我猜只是想找到我的方法。

感谢大家的帮助 -B

【问题讨论】:

    标签: parsing recursion erlang list


    【解决方案1】:

    随着 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">>]
    

    请注意,尽管看起来错误(&lt;&lt;"6CW-5"&gt;&gt;&lt;&lt;"\"8N"&gt;&gt;),但底层表示是正确的,字符串是 VM 试图弄清楚如何打印出二进制文件。以原始格式输出时查看相同的调用:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-26
      • 2014-07-07
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2018-10-24
      相关资源
      最近更新 更多