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]),
再次感谢您的时间和精力。
答案 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
。