Erlang - 从封闭的花括号中解析数据

时间:2014-07-09 13:16:38

标签: erlang ejabberd erlang-shell erlangweb erlang-driver

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 个答案:

答案 0 :(得分:4)

这是一个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").

现在,在您的模块中访问(第一个)&#34; timok&#34;您可以使用erlang记录语法(假设JidData包含上述数据):

Out = JidData#jid.user.

不推荐:

正如记录一样,在它们的外观后面,元组,你也可以访问元组的第n个元素

Out = element(2,JidData).

或者只是使用模式匹配:

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

使用记录定义

记录基本上是元组上的语法糖。它仍然是一个元组,可以这样对待。他们很容易使用,但你应该尽你所能避免将记录视为元组,除非你真的知道你在做什么。

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

答案 1 :(得分:1)

您似乎正在尝试访问存储在变量_From中的元组中的第二项。只需使用模式匹配即可访问:

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

由于您使用的是from变量,因此前面不应该有下划线。在您的代码中将_From更改为From