【问题标题】:How to do pattern matching on a binary in Erlang?如何在 Erlang 中对二进制文件进行模式匹配?
【发布时间】:2013-01-04 23:27:27
【问题描述】:

我想对二进制文件进行递归,并在每次调用中从二进制文件中读取最多 32 位,并将其返回到新的二进制文件中。但我无法让模式匹配按我的意愿工作。

binaryToBinary(Source) ->
    binaryToBinaryAux(Source, <<>>).

binaryToBinaryAux(<<>>, Target) ->
    Target;
binaryToBinaryAux(<<H:32/binary, T/binary>>, Target) ->
    binaryToBinaryAux(<<T/binary>>, <<Target/binary, H>>).

这是我得到的模式匹配错误:

10> mymodule:binaryToBinary(<<"JonasPonas">>).
** exception error: no function clause matching
                    mymodule:binaryToBinaryAux(<<"JonasPonas">>,<<>>) 
                                                          (mymodule.erl, line 51)

我对二进制的模式匹配做错了什么?

【问题讨论】:

    标签: binary erlang pattern-matching


    【解决方案1】:

    &lt;&lt;H:32/binary, T/binary&gt;&gt; 模式匹配至少包含 32 个字节的二进制文件,将前 32 个字节分配给 H,其余字节分配给 T。模式&lt;&lt;&gt;&gt; 匹配空二进制文件。这些是您唯一的模式。

    &lt;&lt;"JonasPonas"&gt;&gt; 既不是空的,也没有至少 32 个字节。因此,它与您的任何一种模式都不匹配,您会得到您所做的错误。

    要解决此问题,请添加一个模式来处理小于 32 字节的二进制文件(您也可以去掉空模式,因为它会变得多余)。

    【讨论】:

    • 我添加了binaryToBinaryAux(&lt;&lt;Bin/binary&gt;&gt;, Target) -&gt; Target. 的案例,但随后出现此错误:** exception error: bad argument in function mymodule:binaryToBinaryAux/2
    • @Jonas 但不是输入&lt;&lt;"JonasPonas"&gt;&gt;,对吧?当我在超过 32 个字节的输入上运行您的代码时(即使没有额外的情况),我会收到该错误。要修复它,请在您在问题中发布的代码的第 7 行将 H 替换为 H/binary
    【解决方案2】:

    这应该可以纠正:

    binaryToBinary(Source) ->
        binaryToBinaryAux(Source, <<>>).
    
    binaryToBinaryAux(<<>>, Target) ->
        Target;
    binaryToBinaryAux(<<H:32/binary, T/binary>>, Target) ->
        binaryToBinaryAux(<<T/binary>>, <<Target/binary, H/binary>>);
    binaryToBinaryAux(Rest, Target) ->
        binaryToBinaryAux(<<>>, <<Target/binary, Rest/binary>>).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 2012-05-23
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      相关资源
      最近更新 更多