【问题标题】:Erlang: Search through list for matching stringErlang:在列表中搜索匹配的字符串
【发布时间】:2014-10-05 02:25:41
【问题描述】:

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

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

'server' 记录中的 'users' 列表仅定义为 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}]}]}"

【问题讨论】:

    标签: string list erlang


    【解决方案1】:

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

    而且你的论点有点不对劲。您正在使用记录,正确用法如下所示:VariableThatStoresRecord#record_name.filed_name。在您的情况下,它可能类似于State#state.users(或者如果您不喜欢这种双重状态,则只需将loop 函数中的State 参数缩短为S)。

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

    关于错误信息。首先是你得到undef 错误。所以这意味着你正在调用未定义的函数(这很常见,因为 Erlang 是动态语言)。比你得到代表呼叫跟踪的元组列表,从最新到最旧,就像这样

    [ { function call definition }
      { function call definition }
      { function call definition } ]
    

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

    {list,member,[\"&lt;0.568.0&gt;\",2],[]} 可以看出,您正在尝试使用参数"&lt;0.568.0&gt;"2 调用list:member 函数。如果您将呼叫更改为lists:member(ClientPID, Server#server.users),它应该可以工作。

    由于大多数错误消息通常是嵌套的元组/列表,如果它们出现在一行中,则很难阅读。所以我所做的就是将它们复制到我的编辑器,将单行拆分为多行,然后自动缩进(emacs 确实很棒,一些编辑器可以遵循这种类似 lisp 的 Erlang 缩进)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多