【问题标题】:Erlang binary pattern matching failsErlang 二进制模式匹配失败
【发布时间】:2012-07-03 06:38:49
【问题描述】:

为什么这会发出错误匹配错误?我不知道为什么会失败:

<<IpAddr, ":*:*">> = <<"2a01:e34:ee8b:c080:a542:ffaf:*:*">>.

【问题讨论】:

    标签: binary erlang pattern-matching binaries


    【解决方案1】:

    二进制文件的模式匹配从左到右进行,因此它会在尝试下一段之前首先匹配IpAddr。在匹配之前没有回溯。像IpAddr 这样的默认类型变量匹配一个字节。有关正确描述和更多示例,请参阅 Bit Syntax ExpressionsBit Syntax

    作为在此处使用模式匹配的替代方法,您可以考虑使用binary 模块。有两个函数可能对您有用:binary:match/2/3binary:split/2/3。这些搜索可能更适合您的问题。

    作为最后一种选择,您可以尝试使用正则表达式和re 模块。

    【讨论】:

      【解决方案2】:

      您需要指定IpAddr 的大小,以便进行模式匹配:

      1> <<IpAddr:28/binary, ":*:*">> = <<"2a01:e34:ee8b:c080:a542:ffaf:*:*">>.
      <<"2a01:e34:ee8b:c080:a542:ffaf:*:*">>
      2> IpAddr.
      <<"2a01:e34:ee8b:c080:a542:ffaf">>
      

      【讨论】:

      • 大小可变怎么办?
      • 这种情况不会发生,对吧?如果是这样,也可以从变量中读取字节数:IpAddr:IpLength/binary
      • 不幸的是,在这种情况下它可以作为 eacg 段中的字符数可以变化。
      • @DiegoSevilla 我不认为 erlang 可以做到这一点。 IpLength is unbound 会出错。
      猜你喜欢
      • 1970-01-01
      • 2012-05-23
      • 2020-04-23
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2013-01-01
      • 1970-01-01
      相关资源
      最近更新 更多