2

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

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

4

2 回答 2

4

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

使用记录定义

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

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

于 2014-07-09T13:36:46.637 回答
1

您似乎正在尝试访问存储在变量中的元组中的第二项_From。这可以通过使用模式匹配简单地访问:

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

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

于 2014-07-09T13:37:32.967 回答