Erlang专家,我从ejabberd服务器获取如下数据

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

我对这种数据类型非常困惑。我所需要的只是从随附的花括号中获取timok。 {}但不确定如何获取价值。任何获得价值的代码都会很有帮助。目前,我正在使用以下代码打印值
?INFO_MSG("Data of Fromu ~p",[_From]),

再次感谢您的时间和精力。

最佳答案

那是一个erlang记录(这是一个元组,第一个元素是一个原子,其他元素是列表/字符串/二进制文件)。

推荐:

Ejabberd具有jid record定义(第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.

使用记录定义

记录基本上是元组上的语法糖。它仍然是一个元组,可以这样处理。它们很容易使用,但是您应该尽力避免将记录视为元组,除非您真的知道自己在做什么。

并且因为在这种情况下您甚至无法控制记录定义,所以您确实应该使用它,否则更新后定义的更改将使您的代码无效。

关于erlang - Erlang-解析括号中的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24654788/

10-17 01:24