Erlang:在列表中搜索匹配的字符串

时间:2014-10-04 17:35:28

标签: string list erlang

希望这就是我的问题(读取erlang打印的错误日志时遇到问题)。我试图在列表中搜索以找到匹配的字符串(来自客户端的PID转换为字符串)但它只会导致崩溃。

...
#7 ClientPID = pid_to_list(From),
#8 list:member(ClientPID, #server.users), % 'users' being a list in the record 'server'
...

'用户'列表中的服务器'记录只是定义为users = [],如果它有帮助。

崩溃报告:

** Reason for termination ==
** "{undef,[{list,member,[\"<0.568.0>\",2],[]}, {server,loop,2,[{file,\"server.erl\"},{line,8}]},
{genserver,loop,2,[{file,\"c:/Erlang/ServCli/genserver.erl\"}{line,13}]}]}"

1 个答案:

答案 0 :(得分:2)

模块名为lists而不是list。这是常见的错误:)

你的论点很少。您正在使用记录,正确的用法如下所示:VariableThatStoresRecord#record_name.filed_name。在您的情况下,如果您不喜欢此双重状态,则可能类似于State#state.users(或State函数中的loop参数缩短S #state.users

你正在做的实际上是一个语义suger,它返回记录/元组给定字段中的哪个元素被存储(因为所有记录实际上都是元组)。在你的情况下,2返回users(第一个元素是记录名称,我想undef是记录中第一个定义的字段。)

关于错误消息。首先是你得到[ { function call definition } { function call definition } { function call definition } ] 错误的事情。因此,这意味着您正在调用未定义的函数(这很常见,因为Erlang是动态语言)。你得到的元组列表代表了呼叫追踪,从最新到最老,就像这样

list

第一个是最有趣的,因为它是对未定义函数的调用。您可以看到调用模块member和函数{list,member,[\"<0.568.0>\",2],[]}。除此之外,你可以期待实际的参数,或者只是arrity(这些变量可能已经在erlang中被垃圾收集),以及一些关于函数定义的信息(比如文件和行号)。

list:member您可以看到您正在尝试使用参数"<0.568.0>"2来调用lists:member(ClientPID, Server#server.users)函数。如果您将通话更改为{{1}},则应该有效。

由于大多数错误消息通常是嵌套的元组/列表,如果它们以一行显示,则很难读取。所以我所做的就是将它们复制到我的编辑器中,将单行分成多行,而不是自动缩进(emacs真的很棒,而且有些编辑可以按照这种类似lisp的方式进行Erlang)。