0

ファイルのリストを繰り返し処理し、内容をリストに保存してから、そのリスト内の単語「blue()」の位置を検索しています。単語を見つけるために使用しているコードは次のとおりです。

Item = "blue()",
{ok, Device} = file:read_file([File]),
Li = string:tokens(erlang:binary_to_list(Device), "\n"),
Nlist = lists:map(fun (X) ->string:strip(X) end, Li),
Index = string:str(Nlist, [Item]),
io:format("~p", [Index]).

これは単に機能しません。「0」が返されます。おそらくスペースに関係していると思ったので、それらを削除しようとしましたが、成功しませんでした。約2時間作業した後、アイデアがなくなりました:/

4

2 に答える 2

0

あなたはそれを行うことができlists:mapますstring:strip

lists:map(fun(E) -> string:strip(E) end, List)

7> lists:map(fun(E) -> string:strip(E) end, ["hello", " world"]).      
["hello","world"]
于 2013-01-23T20:15:07.267 に答える
0

このstringモジュールは、フラット リストが機能することを期待しています。リストのリストを渡しています。「blue()」という用語のインデックスを特定するだけが目的の場合は、文字列分割のざわめきを使わずに re モジュールを使用できます。

Data = file:read_file([File]),
case re:run(Data, "blue()") of  % Note that re takes binaries, strings, and iolists as input
    {match, [{StartIndex, StopIndex}]} -> io:format("~p", [StartIndex]);
    nomatch -> io:format("Item not found.")
end.

または、あまり変更せずに、次のように Nlist で「blue()」という用語を探すことができます (用語の行番号と文字オフセットを出力します)。

find_terms(Item, L) -> find_terms(Item, L, 1).

find_terms(Item, [], N) ->
    ok;
find_terms(Item, [String|Rest], LineNumber) ->
    case string:str(String, Item) of
        0 -> % string:str returns 0 when the substring is not found
            find_terms(Item, Rest, LineNumber + 1);
        Index ->
            io:format("~p:~p", [Line, Index]),
            find_terms(Item, Rest, LineNumber + 1);
    end.

そして、あなたはそれをfind_terms("blue()", Nlist)

于 2013-01-23T20:57:10.513 に答える