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

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 回答
0

你可以用lists:mapstring: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 回答