【发布时间】:2012-07-03 06:38:49
【问题描述】:
为什么这会发出错误匹配错误?我不知道为什么会失败:
<<IpAddr, ":*:*">> = <<"2a01:e34:ee8b:c080:a542:ffaf:*:*">>.
【问题讨论】:
标签: binary erlang pattern-matching binaries
为什么这会发出错误匹配错误?我不知道为什么会失败:
<<IpAddr, ":*:*">> = <<"2a01:e34:ee8b:c080:a542:ffaf:*:*">>.
【问题讨论】:
标签: binary erlang pattern-matching binaries
二进制文件的模式匹配从左到右进行,因此它会在尝试下一段之前首先匹配IpAddr。在匹配之前没有回溯。像IpAddr 这样的默认类型变量匹配一个字节。有关正确描述和更多示例,请参阅 Bit Syntax Expressions 和 Bit Syntax。
作为在此处使用模式匹配的替代方法,您可以考虑使用binary 模块。有两个函数可能对您有用:binary:match/2/3 和 binary:split/2/3。这些搜索可能更适合您的问题。
作为最后一种选择,您可以尝试使用正则表达式和re 模块。
【讨论】:
您需要指定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。