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
,