Найти все вхождения кортежа в произвольном выражении - PullRequest
0 голосов
/ 20 июня 2019

У меня есть произвольный термин, содержащий неизвестные хорошо структурированные данные эрланга.Мне нужно найти все вхождения кортежа {atom, _} в любом месте этого термина.

Сопоставление с образцом основано на знании, какая структура содержит ваши данные, но я не знаю.

Пример, из которого мне нужно извлечь

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

Есть ли общий образецподходящий способ пройти произвольный член?

Ответы [ 2 ]

4 голосов
/ 20 июня 2019

Не совсем.Вы должны были бы обработать каждый тип структуры данных, которую вы хотите специально пересечь.Что-то вроде:

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
    [].
0 голосов
/ 22 июня 2019

Это не полный ответ, так как я только что установил 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 не совсем то, что вам нужно, и само регулярное выражение должно быть расширено, чтобы включить значение после атома: /

(из-за нехватки времени я не могудайте ответ «копировать и вставить», но я сделал нечто подобное, чтобы разобрать текстовые логи из другой программы и найти то, что мне нужно. Надеюсь, это укажет вам на еще одну дополнительную работу.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...