【问题标题】:Erlang - Parse data from the enclosed curly bracesErlang - 从封闭的花括号中解析数据
【发布时间】:2014-08-30 13:03:47
【问题描述】:

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 erlang-shell erlangweb erlang-driver


    【解决方案1】:

    这是一个 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 shell 已经知道记录定义,上述方法只能在 erlang shell 中工作
    • 是的。为了在一个模块中使用记录定义,应该包含相关的ejabberd头文件(如果有的话)。
    • @Berzemus - 非常感谢您的回答。在您的回答的帮助下,我能够检索到该值。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 2022-06-12
      • 1970-01-01
      • 2017-08-24
      • 2019-01-26
      • 2016-10-07
      • 1970-01-01
      相关资源
      最近更新 更多