2017-04-23 11 views
1

実際に文字列が実際にリストに含まれているかどうかを調べようとしています。ここでリスト内の文字列を検索する - Erlang

comparing() -> 
    FileName = "msg-0001", 
    {ok,[NumLine],_} = io_lib:fread("msg-~d",FileName), 
    io:format("Numline:~p~n", [NumLine]), 
    {ok, Pars} = file:read_file("parsing.txt"), 
    {ok, Dump} = file:read_file("msg-0001"), 
    StringNumline = lists:flatten(io_lib:format("~p", [NumLine])), 
    io:format("StringNumline:~p~n", [StringNumline]), 
    StringDump = lists:flatten(io_lib:format("~p", [Dump])), 
    io:format("StringDump:~p~n", [StringDump]), 
    SubStringDump = string:substr(StringDump, 4), 
    io:format("SubStringDump:~p~n", [SubStringDump]), 
    Ndump = concat(StringNumline, SubStringDump), 
    io:format("Ndump:~p~n", [Ndump]), 
    FineDump = Ndump--"\">>", 
    io:format("FineDump:~p~n", [FineDump]), 
    L1 = binary:split(Pars, <<"\r\n">>, [global]), 
    io:format("L1=~p~n", [L1]), 
    Check = lists:member(FineDump, L1), 
    io:format("Check=~p~n", [Check]), 

    if 
     Check -> 
      file:write_file("check.txt", "true\n", [append]); 

     true -> 
      file:write_file("check.txt", "false\n", [append]) 
    end. 

は、コードの出力です:

10> c(compare).   
{ok,compare} 
11> compare:comparing(). 
Numline:1 
StringNumline:"1" 
StringDump:"<<\"hello\">>" 
SubStringDump:"hello\">>" 
Ndump:"1hello\">>" 
FineDump:"1hello" 
L1=[<<"0hello">>,<<"something">>,<<"anyword">>,<<"1hello">>,<<"2exercise">>, 
    <<"2solution">>,<<"3test">>,<<"new">>,<<"4check">>,<<"4grade">>] 
Check=false 
ok 

私はラインCheck = lists:member(FineDump, L1)で問題を抱えている私のコードがあります。 1helloはリストのメンバーですが、常に間違っています。間違いがどこにあるのか分かりません。それは機能リストですか:この操作のメンバ?または、文字列がリストのメンバーであるかどうかを調べるための他の方法がありますか?私はErlangで初めてです。

答えて

2

L1はバイナリのリストで、FineDumpは文字列(Erlangの整数のリスト)です。 lists:member/2を呼び出すには、FineDumpをバイナリに変換する必要があります。

これは動作するはずです:

Check = lists:member(list_to_binary(FineDump), L1), 

をまた、必要以上に、あまりにも複雑な方法な方法でこれをやっているようです。私がロジックをうまく理解していれば、あなたはそのコードをすべて必要としません。あなただけ使用してバイナリにNumLineDump連結することができます:

X = <<(integer_to_binary(NumLine))/binary, Dump/binary>> 

をして、lists:memberに直接それを使用:

lists:member(X, L1) 
1> NumLine = 1. 
1 
2> Dump = <<"hello">>. 
<<"hello">> 
3> <<(integer_to_binary(NumLine))/binary, Dump/binary>>. 
<<"1hello">> 
+0

それは動作しますが、おかげでたくさん:) –

+0

私を見てください編集。整数とバイナリを連結するためだけに、この 'string:substr'と' io:format'をすべて行う必要はありません(バイナリに二重引用符または山括弧が含まれている場合は間違っています)。 – Dogbert

+0

偉大な解決策は、私は自分のコードを書くために多くの方法を試していたので、私はこれを行いました。それは働いたので、私はそれに満足していた。しかし、あなたの道ははるかに良いです。どうもありがとう :) –

関連する問題