2014-07-09 30 views
2

二郎專家,我越來越喜歡從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]), 

再次感謝您的時間和精力。

回答

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"). 

現在,在你的模塊中訪問(第一個)「timok」您的數據的元素,你可以使用Erlang的記錄語法(假設JidData包括上面提到的數據):

Out = JidData#jid.user. 

不推薦:

由於記錄,僅次於自己的外表,元組,你可以還可以訪問數組的第n個元素

Out = element(2,JidData). 

或者乾脆使用模式匹配:

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

使用記錄定義

的記錄基本上是在一個元組syntaxic糖。它仍然是一個元組,可以這樣對待。他們很容易處理,但是你應該儘可能地避免把記錄看作一個元組,除非你真的知道你在做什麼。

因爲在這種情況下,您甚至不控制記錄定義,所以您應該使用它,否則更新後定義中的更改將使您的代碼無效。

+0

如果erlang shell已經知道記錄定義 – bjhaid

+0

,那麼以上只能在erlang shell中工作。爲了在模塊中使用記錄定義,應該包含相關的ejabberd頭文件(如果有的話)。 – Berzemus

+0

@Berzemus - 非常感謝你的回答。我能夠在答案的幫助下找回價值。 –

1

您似乎試圖訪問存儲在變量_From中的元組中的第二項。這可以簡單地通過模式匹配來訪問:

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

由於您使用的是自變量,你不應該在它前面的下劃線。在您的代碼更改_FromFrom