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