匹配字符列表的开头

时间:2016-09-18 02:41:45

标签: elixir

在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这样的东西,但那不起作用。而且我查看了文档,但我没有找到更好的方法来匹配它。有没有更好的方法来匹配字符列表中的前缀字符?

1 个答案:

答案 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