2017-02-03 4 views
1

오프라인 메시지를 받으면이 기능을 시작할 것이라고 말하는 코드가 있습니다. 나는이 중 원하는 무엇erlang, ejabberd, 처리 방법 [{text, <<>>, <<"hello">>}] 형식 :

{message,<<"purple2d957668">>,chat,<<>>,undefined,{jid,<<"admin">>,<<"localhost">>,<<"5280">>,<<"admin">>,<<"localhost">>,<<"5280">>},[],[{text,<<>>,<<"Hello">>}],undefined,[{xmlel,<<"active">>,[{<<"xmlns">>,<<"http://jabber.org/protocol/chatstates">>}],[]}],#{}} 

내 메시지를 포함하는 일부입니다

offline_msg_received(From, To, Packet) -> 

패킷이 코드를 다음과 같이 찾고 있습니다. :

[{text,<<>>,<<"Hello">>}] 

전체 패키지 변수와 일치하는 패턴으로이 부분을 얻을 수 있습니다. 그러나, 내 메시지와 일치하는 패턴을 시도했을 때, 그것은 나쁜 주장을 말합니다. 나는 변수를 단지

으로 지정하면
{text,<<>>,<<"Hello">>} 

을 지정할 수 있다는 것을 알고 있습니다. 내 이해에서 뭔가를 둘러싼 []는 그것이 목록 또는 문자열이라는 것을 의미합니다.

여기에 일부 코드를 표시 할 수 있습니다. 이제

{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. 

, 내가 대신 코드 쉘에서 수동으로 작업을 수행하는 경우 :

{text,<<>>,<<"Hello">>} = P8, 
{A, B, C} = P8, 

그런 다음 코드가 작동하고, C 변수에 >> "안녕하세요"< <을 둔다.

내 생각 엔 그 []를 "패키지"변수 내 badmatch 오류와 함께 할 수있는 뭔가가,하지만 난 P8을 인쇄 할 때 몇 가지 이유로 그 기호는 표시되지 않습니다에서 주위. 아무도 좋은 제안을 왜 작동하지 않는가? 나는 숨겨진 []과 관련이 있다고 추측합니다. 그렇지 않으면 쉘 코드 테스트와 동일 해 보입니다.

감사합니다. 이것은 처음 질문을 던지기 때문에 잘못된 것이 아니기를 바랍니다.

답변

3

이유는 당신이 당신의 INFO_MSG 호출 값 주위에 대괄호가 표시되지 않는이 INFO_MSG 값의 목록 아닌 단일 값을 기대하고 있다는 것입니다. 위의 코드에서는 형식 문자열에 단일 지시문 만 있기 때문에 값이 하나의 요소 목록이므로 대괄호가 자동으로 제거됩니다.

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

당신은이 일을하고있는 어려운 방법 : messagetext 레코드에 정의되어 있습니다 : 당신이 쉘에서 이것을 시도 할 수 있도록

INFO_MSG 매크로 작품을 io:format와 같은, xmpp_codec.hrl. 당신이 쉘에로드 된 기록 정의가없는 경우, 기록 요소를 많이 가진 튜플처럼,하지만 당신은 레코드 정의를로드하는 경우, 메시지 대신 다음과 같습니다

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 = #{}} 

당신이 데이터를 찾고있는 사람은 body입니다.

이의 몸 필드를 변수 M에이 레코드를 할당 추출하자
4> Body = M#message.body. 
[#text{lang = <<>>,data = <<"Hello">>}] 

은 그래서 하나 개 text 기록을 포함하는 목록입니다. 의 그에서 data 필드를 추출하자

는 쉘에서 작동하는 방법
6> [#text{data = Data}] = Body. 
[#text{lang = <<>>,data = <<"Hello">>}] 
7> Data. 
<<"Hello">> 

- rr 기능 레코드 정의를로드합니다. 기록 정의를 사용하는 모듈을 작성할 때, 당신은 hrl 파일을 포함해야 할 것 :

-include_lib("xmpp/include/xmpp_codec.hrl"). 

-include_lib 디렉토리는 부하 경로에 xmpp 응용 프로그램을 찾아, 그 include 디렉토리 내부의 파일 xmpp_codec.hrl을 검색합니다 . 컴파일러에 대한 코드 경로를 지정해야 할 수도 있습니다() - 응용 프로그램 내의 ebin 디렉토리가 코드 경로에 있어야합니다.

+1

'# message.body'에서 텍스트를 얻으려면'xmpp : get_text/1' 또는'xmpp : get_text/2' 함수를 사용하는 것이 좋습니다. 후자는 언어로 텍스트를 선택해야 할 때 유용합니다. 또 다른 요점은'xmpp_codec.hrl'을 직접 포함해서는 안된다는 것입니다. 대신'xmpp.hrl'을 포함하십시오. – user2610053