Erlang - анализирует данные из прилагаемых фигурных скобок

Эксперты Erlang, я получаю такие данные с сервера ejabberd

I(<0.397.0>:mod_http_offline:38) : Data of Fromu {jid,"timok","localhost",
                                              "25636221451404911062246700",
                                              "timok","localhost",
                                              "25636221451404911062246700"}

Я очень смущен этим типом данных. Все, что мне нужно, это достать тимок из прилагаемых цветочных скобок. {} Но не уверен, как получить значение. Любой код для получения значения будет очень полезным. В настоящее время я печатаю значения, используя код ниже

?INFO_MSG("Data of Fromu ~p",[_From]),

Еще раз спасибо за ваше время и усилия.

2 ответа

Решение

Это запись erlang (это кортеж, первый элемент атома, списки / строки / двоичные элементы других элементов).

Рекомендуемые:

У Ejabberd есть определение записи jid (строка 411):

-record(jid, {user = <<"">> :: binary(),
        server = <<"">> :: binary(),
        resource = <<"">> :: binary(),
        luser = <<"">> :: binary(),
        lserver = <<"">> :: binary(),
        lresource = <<"">> :: binary()}).

Это в ejabberd/include/jlib.hrl файл, так что вы должны иметь возможность сделать его известным для вашего модуля, включив его следующим образом:

 -include_lib("ejabberd/include/jlib.hrl").

Теперь в вашем модуле для доступа к (первому) элементу "timok" ваших данных вы можете использовать синтаксис записи erlang (при условии, что JidData содержит данные, упомянутые выше):

Out = JidData#jid.user.

Не рекомендуется:

Поскольку записи за их внешним видом являются кортежами, вы также можете получить доступ к n-му элементу кортежа.

Out = element(2,JidData).

Или просто используйте сопоставление с образцом:

{_, Out, _, _, _, _} = JidData.

Использовать определения записей

Запись - это в основном синтаксический сахар на кортеже. Он остается кортежем и может рассматриваться как таковой. С ними легко работать, но вы должны делать все возможное, чтобы не рассматривать запись как кортеж, если вы действительно не знаете, что делаете.

И поскольку в этом случае вы даже не управляете определением записи, вам действительно следует использовать его, в противном случае изменения в определении после обновления сделают ваш код недействительным.

Вы, кажется, пытаетесь получить доступ ко второму элементу в кортеже, хранящемся в переменной _From, Это можно получить, просто используя сопоставление с образцом:

{_, Username, _, _, _, _} = _From

Поскольку вы используете переменную from, перед ней не должно быть подчеркивания. В вашем коде изменить _From в From,

Другие вопросы по тегам