调用:来自Elixir的binary.match Erlang模块,但选项有问题
我的目标是在字符串中查找,从某个索引开始。这似乎是我想要的,但我在选择上有困难。从文档中可以看出,它似乎需要一个包含一个元组的列表,其中包含一个范围和一个部分。我在任何地方都找不到“范围”的含义,但我也不确定我是否正确地从长生不老药中调用了它 以下是我正在尝试的一些事情,但我不断遇到一个参数错误:调用:来自Elixir的binary.match Erlang模块,但选项有问题,erlang,elixir,Erlang,Elixir,我的目标是在字符串中查找,从某个索引开始。这似乎是我想要的,但我在选择上有困难。从文档中可以看出,它似乎需要一个包含一个元组的列表,其中包含一个范围和一个部分。我在任何地方都找不到“范围”的含义,但我也不确定我是否正确地从长生不老药中调用了它 以下是我正在尝试的一些事情,但我不断遇到一个参数错误: :binary.match(my_str, "foo", [{[], {0, 100}}]) :binary.match(my_str, "foo", [{[], [start: 0, length
:binary.match(my_str, "foo", [{[], {0, 100}}])
:binary.match(my_str, "foo", [{[], [start: 0, length: 100]}])
任何帮助都将不胜感激。谢谢大家! Erlang/OTP文档可能很难阅读,尤其是来自Elixir的不同语法的文档。根据记录,Erlang中的原子通常以小写字母开头,变量以大写字母开头,而Elixir中的变量通常以小写字母开头,原子以冒号开头。这里,
scope
只是一个原子
函数binary:match/3
,即Elixir中的:binary.match/3
,以主题、模式和选项作为参数。选项指定为:
Options = [Option]
Option = {scope, part()}
part() = {Start :: integer() >= 0, Length :: integer()}
这意味着它是一个包含零个或多个选项的列表,其中选项
是一个元组,其第一个元素为范围
原子,第二个元素为部分()。part()
是一个元组,包含两个元素,Start
,一个非负整数,Length
,一个整数(允许使用不同的、有文档记录的含义的负长度)。根据规范规定,为binary:match/3提供多个作用域选项是合法的,但这没有文档记录,结果也没有定义
要从特定索引到二进制文件的末尾搜索二进制文件,请使用元组{scope,{Start,Length}
(或Elixir中的{scope,{Start,Length}}
),以Start作为索引(基于0),以Length作为二进制文件减去Start的大小
如果Start
或Start+Length
超出输入字符串的范围,则函数将引发异常,如下所示:
如果在选项中指定了{scope,{Start,Length}}
,则Start
>大小
对于主题
,开始+长度
<0或开始+长度
>主题
的大小,引发了badarg
异常
字符串“hello world”的用法示例如下:
binary:matches(<<"hello world">>, <<"o">>).
binary:match(<<"hello world">>, <<"o">>, [{scope, {0, byte_size(<<"hello world">>)}}]).
binary:match(<<"hello world">>, <<"o">>, [{scope, {5, byte_size(<<"hello world">>) - 5}}]).
实际上,Options
可以被视为一个元素,因为所有元素都是两个元素的元组,其中第一个元素是原子。括号可以省略,因为选项是可选的,您可以调用:binary.match/2
请注意,此处应使用byte_size/1
,而不是String.length/1
,因为它们(不一定)返回相同的值String.length/1
返回字符数,而byte\u size/1
返回字节数-这是binary:match/3
函数所期望的(并返回)。差异出现在编码为几个字节的非ASCII(7位)字符上。答案!!谢谢你的详细说明。这将有助于我将来理解Erlang文档。我还感谢您解释了我注意到的关于byte_size/String.length的一个奇怪之处。在最后两个elixir代码示例的末尾有一个额外的花括号。@BobWoodley谢谢您,修复了。
:binary.matches("hello world", "o")
:binary.match("hello world", "o", scope: {0, byte_size("hello world")})
:binary.match("hello world", "o", scope: {5, byte_size("hello world") - 5})