erlang,ejabberd,如何处理[{text,<;<;<;>;,<;<;<;<;hello>;}]格式

erlang,ejabberd,如何处理[{text,<;<;<;>;,<;<;<;<;hello>;}]格式,erlang,ejabberd,Erlang,Ejabberd,因此,我的代码中有一个钩子,表示如果收到脱机消息,它将启动此功能 offline_msg_received(From, To, Packet) -> 数据包的代码如下所示: {message,<<"purple2d957668">>,chat,<<>>,undefined,{jid,<<"admin">>,<<"localhost">>,<<"5280">>,<&

因此,我的代码中有一个钩子,表示如果收到脱机消息,它将启动此功能

offline_msg_received(From, To, Packet) ->
数据包的代码如下所示:

{message,<<"purple2d957668">>,chat,<<>>,undefined,{jid,<<"admin">>,<<"localhost">>,<<"5280">>,<<"admin">>,<<"localhost">>,<<"5280">>},[],[{text,<<>>,<<"Hello">>}],undefined,[{xmlel,<<"active">>,[{<<"xmlns">>,<<"http://jabber.org/protocol/chatstates">>}],[]}],#{}}
{message,,chat,,undefined,{jid,,,,,,,,},[{text,,,}],undefined,[{xmllel,,[{,},,][,},][,]},{}
我想要的是包含我信息的部分。即:

[{text,<<>>,<<"Hello">>}]
[{text,,}]
我可以通过与整个包变量的模式匹配来得到这部分。然而,当我尝试与我的消息进行模式匹配时,它显示了错误的参数。我知道如果我用

{text,<<>>,<<"Hello">>}
{text,,}
然后我就可以和它匹配了。根据我的理解,在某物周围看到[]意味着它是一个列表或字符串

我可以在这里展示一些代码

{P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11} = Packet, %% P8 is the message I want.
?INFO_MSG("----------------------P8:  ~p~n", P8), %% This shows   {text,<<>>,<<"Hello">>}
{A, B, C} = P8,  %% This gives me a badmatch error.
{P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11}=Packet,%%P8是我想要的消息。
这显示了{text,,}
{A,B,C}=P8,%%这给了我一个不匹配错误。
现在,如果我在代码shell中手动执行此操作:

{text,<<>>,<<"Hello">>} = P8,
{A, B, C} = P8,
{text,,}=P8,
{A,B,C}=P8,
然后代码开始工作,并输入C变量

我猜“Package”变量中围绕它的[]与我的badmatch错误有关,但由于某些原因,在我打印P8时,这些符号没有出现。有没有人能提出一个好的建议来解释为什么它不起作用?我猜它与隐藏[]有关,因为在其他方面它看起来与我的shell代码测试相同


谢谢。这是我第一次在这里提问,所以我希望我没有做错任何事。

您在
INFO\u MSG
调用中没有看到值周围的方括号的原因是
INFO\u MSG
需要一个值列表,而不仅仅是一个值。在上面的代码中,它正好起作用,因为格式字符串只包含一个指令,而值是一个元素的列表,所以括号会自动去掉

INFO\u MSG
宏的工作原理与
io:format
相同,因此您可以在shell中尝试:

%% two arguments
io:format("~p ~p\n", [foo, bar]).
%% one argument - we still need square brackets
io:format("~p\n", [foo]).

这样做很困难:)
message
text
是中定义的记录。如果没有在shell中加载记录定义,则记录看起来像一个包含大量元素的元组,但如果加载记录定义,则消息看起来像这样:

1> rr("include/xmpp_codec.hrl").
[address,addresses,adhoc_actions,adhoc_command,adhoc_note,
 bind,block,block_list,bob_data,bookmark_conference,
 bookmark_storage,bookmark_url,bytestreams,caps,
 carbons_disable,carbons_enable,carbons_private,
 carbons_received,carbons_sent,chatstate,client_id,compress,
 compress_failure,compressed,compression,csi,db_feature,
 db_result,db_verify|...]
2> {message,<<"purple2d957668">>,chat,<<>>,undefined,{jid,<<"admin">>,<<"localhost">>,<<"5280">>,<<"admin">>,<<"localhost">>,<<"5280">>},[],[{text,<<>>,<<"Hello">>}],undefined,[{xmlel,<<"active">>,[{<<"xmlns">>,<<"http://jabber.org/protocol/chatstates">>}],[]}],#{}}. 
#message{id = <<"purple2d957668">>,type = chat,lang = <<>>,
         from = undefined,
         to = {jid,<<"admin">>,<<"localhost">>,<<"5280">>,
                   <<"admin">>,<<"localhost">>,<<"5280">>},
         subject = [],
         body = [#text{lang = <<>>,data = <<"Hello">>}],
         thread = undefined,
         sub_els = [{xmlel,<<"active">>,
                           [{<<"xmlns">>,
                             <<"http://jabber.org/protocol/chatstates">>}],
                           []}],
         meta = #{}}
这是一个包含一条
text
记录的列表。让我们从中提取
数据
字段:

6> [#text{data = Data}] = Body.
[#text{lang = <<>>,data = <<"Hello">>}]
7> Data.
<<"Hello">>

-include_lib
目录将在加载路径上查找
xmpp
应用程序,并在其
include
目录中搜索文件
xmpp_codec.hrl
。您可能需要指定编译器的代码路径,类似于
erlc-pa path/to/xmpp/ebin my_module.erl
-请注意,应用程序中的
ebin
目录应该位于代码路径上。

INFO_MSG
调用中没有看到值周围的方括号的原因是
INFO_MSG
需要一个值列表,不仅仅是一个值。在上面的代码中,它正好起作用,因为格式字符串只包含一个指令,而值是一个元素的列表,所以括号会自动去掉

INFO\u MSG
宏的工作原理与
io:format
相同,因此您可以在shell中尝试:

%% two arguments
io:format("~p ~p\n", [foo, bar]).
%% one argument - we still need square brackets
io:format("~p\n", [foo]).

这样做很困难:)
message
text
是中定义的记录。如果没有在shell中加载记录定义,则记录看起来像一个包含大量元素的元组,但如果加载记录定义,则消息看起来像这样:

1> rr("include/xmpp_codec.hrl").
[address,addresses,adhoc_actions,adhoc_command,adhoc_note,
 bind,block,block_list,bob_data,bookmark_conference,
 bookmark_storage,bookmark_url,bytestreams,caps,
 carbons_disable,carbons_enable,carbons_private,
 carbons_received,carbons_sent,chatstate,client_id,compress,
 compress_failure,compressed,compression,csi,db_feature,
 db_result,db_verify|...]
2> {message,<<"purple2d957668">>,chat,<<>>,undefined,{jid,<<"admin">>,<<"localhost">>,<<"5280">>,<<"admin">>,<<"localhost">>,<<"5280">>},[],[{text,<<>>,<<"Hello">>}],undefined,[{xmlel,<<"active">>,[{<<"xmlns">>,<<"http://jabber.org/protocol/chatstates">>}],[]}],#{}}. 
#message{id = <<"purple2d957668">>,type = chat,lang = <<>>,
         from = undefined,
         to = {jid,<<"admin">>,<<"localhost">>,<<"5280">>,
                   <<"admin">>,<<"localhost">>,<<"5280">>},
         subject = [],
         body = [#text{lang = <<>>,data = <<"Hello">>}],
         thread = undefined,
         sub_els = [{xmlel,<<"active">>,
                           [{<<"xmlns">>,
                             <<"http://jabber.org/protocol/chatstates">>}],
                           []}],
         meta = #{}}
这是一个包含一条
text
记录的列表。让我们从中提取
数据
字段:

6> [#text{data = Data}] = Body.
[#text{lang = <<>>,data = <<"Hello">>}]
7> Data.
<<"Hello">>

-include_lib
目录将在加载路径上查找
xmpp
应用程序,并在其
include
目录中搜索文件
xmpp_codec.hrl
。您可能需要指定编译器的代码路径,例如
erlc-pa path/to/xmpp/ebin my_module.erl
-请注意,应用程序中的
ebin
目录应该位于代码路径上。

我想添加,为了从
#message.body
中获取文本,最好使用
xmpp:get_text/1
xmpp:get_text/2
函数。当您需要按语言选择文本时,后者非常有用。另一点是,您不应该直接包括
xmpp\u codec.hrl
。改为包含
xmpp.hrl
。我想补充一点,为了从
#message.body
获取文本,最好使用
xmpp:get_text/1
xmpp:get_text/2
函数。当您需要按语言选择文本时,后者非常有用。另一点是,您不应该直接包括
xmpp\u codec.hrl
。改为包含
xmpp.hrl