Erlang 查找任意项中出现的所有元组

Erlang 查找任意项中出现的所有元组,erlang,Erlang,我得到了一个包含未知的、结构良好的erlang数据的任意项。我需要找到元组{atom,{u}在这个术语中的任何地方的所有匹配项 模式匹配依赖于知道哪个结构包含数据,但我不知道 我需要从中提取的示例 [ {description, ""}, {applications, [ kernel, stdlib, ssl ]}, {env, [ {is_enabled, true}, {jos, {atom,

我得到了一个包含未知的、结构良好的erlang数据的任意项。我需要找到元组{atom,{u}在这个术语中的任何地方的所有匹配项

模式匹配依赖于知道哪个结构包含数据,但我不知道

我需要从中提取的示例

  [
    {description, ""},
    {applications, [
      kernel,
      stdlib,
      ssl
    ]},
    {env, [
      {is_enabled, true},
      {jos, {atom, "2o3urglk3ugr"}},
      {fss_pool, {
        [
          {ja, 10}
        ],
        [
          {host, {atom, "fkejbkjfb"}},
          {port, 6000}
        ]}
      }
    ]}
  ]}.

是否有一种通用的模式匹配方法来遍历任意项?

不太可能。您必须专门处理要遍历的每种数据结构。比如:

traverse({atom, Value}) ->
    %% found it!
    [{atom, Value}];
traverse(List) when is_list(List) ->
    lists:flatmap(fun traverse/1, List);
traverse(Tuple) when is_tuple(Tuple) ->
    lists:flatmap(fun traverse/1, tuple_to_list(Tuple));
traverse(Map) when is_map(Map) ->
    lists:flatmap(fun traverse/1, maps:to_list(Map));
traverse(_Other) ->
    %% not the value we're looking for
    [].

不是真的。您必须专门处理要遍历的每种数据结构。比如:

traverse({atom, Value}) ->
    %% found it!
    [{atom, Value}];
traverse(List) when is_list(List) ->
    lists:flatmap(fun traverse/1, List);
traverse(Tuple) when is_tuple(Tuple) ->
    lists:flatmap(fun traverse/1, tuple_to_list(Tuple));
traverse(Map) when is_map(Map) ->
    lists:flatmap(fun traverse/1, maps:to_list(Map));
traverse(_Other) ->
    %% not the value we're looking for
    [].

这不是一个完整的答案,因为我刚刚安装了OTP22.0,但您可以将上述值转换为二进制,然后使用RE查找所有必需的匹配项

例如:

X=。。。,
B=项_到_二进制(X),
{ok,MP}=re:compile(,[extended]),
{match,Res}=re:run(B,MP,[{capture,all,index}]),
ok=io:fwrite(“BX:~p~p~n~p”,[B,MP,Res])。
re:compile&re:run的选项并不是您所需要的,并且正则表达式本身应该扩展为包含原子后面的值:/


(由于时间限制,我无法给出复制粘贴的答案,但我做了类似的事情,从另一个程序中解析文本日志并找到我需要的内容。我希望这能让您找到另一个可选工作。)

这不是一个完整的答案,因为我刚刚安装了OTP 22.0,但您可以将上述值转换为二进制,然后使用RE查找所有必需的匹配项

例如:

X=。。。,
B=项_到_二进制(X),
{ok,MP}=re:compile(,[extended]),
{match,Res}=re:run(B,MP,[{capture,all,index}]),
ok=io:fwrite(“BX:~p~p~n~p”,[B,MP,Res])。
re:compile&re:run的选项并不是您所需要的,并且正则表达式本身应该扩展为包含原子后面的值:/


(由于时间限制,我无法给出复制粘贴的答案,但我做了类似的事情,从另一个程序中解析文本日志并找到我需要的内容。我希望这能为您提供另一个可选工作。)

因此,您的数据结构以
[
并以一个
}
结尾。你能解释一下这叫什么吗?一个
luple
?你的数据总是一个列表吗?数据中的一个术语可以是:
{atom,{1,2,{atom,3,4}
?或者,它总是
{atom,list}
?它应该是{atom,{u}-应该找到的任何元组匹配。所以你的数据结构以一个
开头[
并以一个
}
结尾。你能解释一下这叫什么吗?一个
luple
?你的数据总是一个列表吗?数据中的一个术语可以是:
{atom,{1,2,{atom,3,4}
?或者它总是
{atom,list}
?它应该是{atom,}-应该找到的任何元组匹配。从这个开始,但是regex不会执行类似于{atom,{sdsd,sdsd}}的操作。用这个开始,regex不会执行类似于{atom,{sdsd,sdsd}的操作etcUsing
list:flatmap/1
用于元组和映射是不必要的优化。您可以调用
travel/1
用于
tuple\u-list/1
maps:to\u-list/1
结果。对于元组和映射使用
list:flatmap/1
是不必要的优化。您可以调用
travel/1
用于
tuple\u-list\u-list/1
映射:到列表/1
结果。