首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找任意项中出现的所有元组

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

Stack Overflow用户
提问于 2019-06-20 19:40:11
回答 2查看 65关注 0票数 0

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

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

我需要从中提取的示例

代码语言:javascript
复制
  [
    {description, ""},
    {applications, [
      kernel,
      stdlib,
      ssl
    ]},
    {env, [
      {is_enabled, true},
      {jos, {atom, "2o3urglk3ugr"}},
      {fss_pool, {
        [
          {ja, 10}
        ],
        [
          {host, {atom, "fkejbkjfb"}},
          {port, 6000}
        ]}
      }
    ]}
  ]}.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-21 01:04:39

不怎么有意思。你必须特别对待你想要遍历的每一种数据结构。类似于:

代码语言:javascript
复制
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
    [].
票数 4
EN

Stack Overflow用户

发布于 2019-06-23 02:56:23

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

例如:

代码语言:javascript
复制
X = ...,
B  = term_to_binary(X),
{ok, MP} = re:compile(<<"atom">>, [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的选项并不完全符合您的要求,并且regex本身应该扩展为包含atom :/之后的值

(由于时间限制,我不能给出复制和粘贴的答案,但我做了一些类似于解析另一个程序的文本日志并找到我需要的东西。我希望这能为您提供另一个可选的解决方案。)

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56685182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档