2013-05-01 119 views
1

我一直試圖比較兩小時的數據。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的總是返回,即使我相信他們應該是平等的! IO:FWRITE打印出完全一樣的東西在我的測試控制檯,即 -

Name>name1< 
Search>name1< 

之前我試過字符串:等於我試圖做我自己的模式匹配,但無論似乎結合我不能讓它起作用。

我錯過了什麼嗎?我真的很感激一些新鮮的眼睛或另一種嘗試的建議。

回答

8

所有這些打印相同的東西,因爲〜s格式iolists(和原子!)以相同的方式。

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的實現與=:=運算符(它是一個模式匹配)並沒有什麼不同,因此對於具有不同結構的等價iolists,它不會返回true。

你可能需要做的是寫一個比較函數,可以比較iolists,這是使用iolist_to_binary/1平凡完成的。

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

你是我的英雄謝謝你! – Holly 2013-05-01 21:07:35