Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用:来自Elixir的binary.match Erlang模块,但选项有问题_Erlang_Elixir - Fatal编程技术网

调用:来自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})