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]),

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


person Timothy Rajan    schedule 09.07.2014    source источник


Ответы (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.

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

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

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

person Berzemus    schedule 09.07.2014
comment
вышеприведенное будет работать только в оболочке erlang, если оболочка erlang уже знает определение записи - person bjhaid; 10.07.2014
comment
Ага. Чтобы использовать определение записи в модуле, необходимо подключить соответствующий заголовочный файл ejabberd (если таковой имеется). - person Berzemus; 11.07.2014
comment
@Berzemus - большое спасибо за ответ. Я смог получить значение с помощью вашего ответа. - person Timothy Rajan; 14.07.2014

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

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

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

person Stratus3D    schedule 09.07.2014