我得到了一个包含未知的结构良好的erlang数据的任意术语。我需要在这个术语的任何地方找到元组{atom,_}的所有匹配项。
模式匹配依赖于知道哪个结构包含您的数据,但我不知道。
我需要从中提取的示例
[
{description, ""},
{applications, [
kernel,
stdlib,
ssl
]},
{env, [
{is_enabled, true},
{jos, {atom, "2o3urglk3ugr"}},
{fss_pool, {
[
{ja, 10}
],
[
{host, {atom, "fkejbkjfb"}},
{port, 6000}
]}
}
]}
]}.有没有一种通用的模式匹配方法来遍历任意项?
发布于 2019-06-21 01:04:39
不怎么有意思。你必须特别对待你想要遍历的每一种数据结构。类似于:
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
[].发布于 2019-06-23 02:56:23
这不是一个完整的答案,因为我刚刚安装了OTP 22.0,但您可以将上面提到的值转换为二进制,然后使用RE查找所有需要的匹配项。
例如:
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 :/之后的值
(由于时间限制,我不能给出复制和粘贴的答案,但我做了一些类似于解析另一个程序的文本日志并找到我需要的东西。我希望这能为您提供另一个可选的解决方案。)
https://stackoverflow.com/questions/56685182
复制相似问题