2016-09-18 55 views
0

在IRC,保持連接活着,你有PONG s到回覆PING S,所以如果一個服務器發送你PING :irc.whatever.com,你要發回PONG :irc.whatever.com,或服務器將關閉連接。比賽開始

我正在使用字符列表,因爲(糾正我,如果我錯了),這就是我的TCP套接字返回。

所以我執行檢查查驗消息,它試圖返回,我需要對乒乓球的服務器,就是: [?P, ?I, ?N, ?G, ? ,?: | host] = msg

這是一個case塊子句。這個問號後面跟着一個空格,對我來說看起來超級狡猾,但它起作用。

我嘗試了像['PING :' | host] = msg之類的東西,但那不起作用。我查看了文檔,但沒有找到更好的方法來匹配此文檔。有沒有更好的方法來匹配字符列表中的起始字符?

回答

2

您可以在模式中使用++此:

iex(1)> 'PING :' ++ host = 'PING :irc.whatever.com' 
'PING :irc.whatever.com' 
iex(2)> host 
'irc.whatever.com' 

我與人物名單的工作,因爲,(糾正我,如果我錯了),這就是我的TCP套接字的回報。

如果你使用:調用gen_tcp,你可以把它通過在:gen_tcp.connect選項傳遞:binary返回二進制文件而不是charlists的。你可以在docs中閱讀更多關於它的內容。返回二進制文件也將比查爾斯特效率更高。如果你這樣做,你可以模式匹配使用<>

iex(1)> "PING :" <> host = "PING :irc.whatever.com" 
"PING :irc.whatever.com" 
iex(2)> host 
"irc.whatever.com" 

這個問號後面有一個空格看起來超級狡猾的我,但它的工作原理。

你不需要再這樣了,但僅供參考,您可以使用?\s代替?。編譯器還拋出了一個預警?

warning: found ? followed by codepoint 0x20 (space), please use \s instead 
+0

你的答案的每一個部分都制定了我。感謝Dogbert!很教育。 – Fuser97381