2012-02-29 48 views
0

我正在嘗試爲ejabberd編寫一個erlang模塊,並且無法完全解決語法問題。在erlang中使用參數運行一個命令

我想要做的是當用戶發送離線消息,運行我寫的腳本。

on_offline(_From, To, _Packet) -> 
     ?INFO_MSG("recieved offline packet to ~p", [To]), 
     ?INFO_MSG("Got offline message", []), 
     osReturn = os:cmd("/opt/ejabberd-2.1.10/newmods/handleoffline.py " ++ To), 
     ?INFO_MSG("Send to handler and got return ~s", [osReturn]), 
     none. 

然而,當我運行它,我得到了一些錯誤,如果我有++在那裏我得到的錯誤

E(< 0.423.0>:ejabberd_hooks:294):{function_clause,

但是,即使我運行它沒有++,我得到另一個錯誤告訴我不匹配。

我想要做的就是在用戶ID的第一部分運行handleoffline.py,任何人都有什麼建議?

+1

請發佈完整的錯誤和沒有++的代碼。 – Isac 2012-02-29 16:25:55

+1

一個錯誤是,osReturn是一個原子,應該是OsReturn – selle 2012-02-29 21:54:46

回答

4

從你提供的很少的信息,並假設你的功能正在調用與ejabberd offline_message_hook我至少可以找到一個問題。 在

osReturn = os:cmd("/opt/ejabberd-2.1.10/newmods/handleoffline.py " ++ To) 

您嘗試使用++來連接你提供列表。但主要問題是不是一個字符串(列表),並且會產生您的錯誤。你的功能是在

on_offline(From, To, Packet) -> ok 

形式,其中 = = #jid(見jlib

一個辦法來糾正,這將是使用

on_offline(_From, To=#jid{user = User, server=Server}, _Packet) -> 
    ... 
    OsReturn = os:cmd("/opt/ejabberd-2.1.10/newmods/handleoffline.py " ++ User), 
    ?INFO_MSG("Send to handler and got return ~s", [OsReturn]), 
    none. 

因爲該字段用戶#jid是一個字符串。

編輯:另一個錯誤是,你需要昌osReturn到OsReturn因爲第一個是原子,並會提高你的代碼中的錯誤,像selle指出


編輯你的問題,並添加更多信息如果你有更多的問題,或者讓這個更清楚。