在IRC中,要保持连接处于活动状态,您必须使用PING
回复PONG
,因此如果服务器向您发送PING :irc.whatever.com
,则必须发回PONG :irc.whatever.com
1}},或服务器将关闭您的连接。
我正在使用角色列表因为,(如果我错了,请纠正我),这就是我的TCP套接字返回的内容。
所以我对ping消息的检查实现了:它试图返回我需要的pong服务器:
[?P, ?I, ?N, ?G, ? ,?: | host] = msg
这是case
块中的一个子句。那个问号跟着一个空格对我来说看起来很狡猾,但它确实有效。
我试过像['PING :' | host] = msg
这样的东西,但那不起作用。而且我查看了文档,但我没有找到更好的方法来匹配它。有没有更好的方法来匹配字符列表中的前缀字符?
答案 0 :(得分:2)
您可以在模式中使用++
:
iex(1)> 'PING :' ++ host = 'PING :irc.whatever.com'
'PING :irc.whatever.com'
iex(2)> host
'irc.whatever.com'
我正在使用角色列表,因为(如果我错了,请纠正我),这是我的TCP套接字返回的内容。
如果您正在使用:gen_tcp,则可以通过在:binary
的选项中传递:gen_tcp.connect
来使其返回二进制文件而不是字符列表。您可以在docs中详细了解相关信息。返回二进制文件也比查理列表更有效。如果您这样做,可以使用<>
进行模式匹配:
iex(1)> "PING :" <> host = "PING :irc.whatever.com"
"PING :irc.whatever.com"
iex(2)> host
"irc.whatever.com"
那个问号跟着一个空格对我来说看起来很狡猾,但它确实有用。
你不再需要它,但只是fyi,你可以使用?\s
代替?
。编译器还会对?
:
warning: found ? followed by codepoint 0x20 (space), please use \s instead