Erlang 字符串比较不起作用



我已经花了几个小时比较两个比特的数据。

这就是我写的内容。

find_client(Search, [Client|Client_list])->
   {Name,Socket} = Client,
   io:fwrite("Name>~s<~n",[Name]),
   io:fwrite("Search>~s<~n",[Search]),
   case string:equal(Name,Search) of
      true->
         do_something;
      false->
         do_something_else
   end;
find_client(Search,[])->
   not_found.

问题是do_something_else总是返回,即使我确信它们应该是相等的!fwrite在我的测试中打印出完全相同的东西到控制台,即-

Name>name1<
Search>name1<

在我尝试string:equal之前,我试着做我自己的模式匹配,但无论组合如何,我似乎都不能让它工作。

我错过了什么吗?我真的很感激你的新眼光或建议我用另一种方法来尝试。

所有这些都打印相同的内容,因为~s以相同的方式格式化分子(和原子!)

io:fwrite("~s~n", ["name"]),
io:fwrite("~s~n", [<<"name">>]),
io:fwrite("~s~n", [name]),
io:fwrite("~s~n", [[$n, $a, <<"m">>, "e"]]).

更好的"这到底是什么?!"调试技术是使用~p格式字符串。用上面的例子试试吧。

string:equal/2的实现与=:=的操作符并没有什么不同(它是一个模式匹配),所以对于具有不同结构的等价操作符,它不会返回true。

你可能需要做的是写一个比较函数来比较iolists,这很容易用iolist_to_binary/1来完成。

iolist_equal(A, B) ->
    iolist_to_binary(A) =:= iolist_to_binary(B).

最新更新