Erlang 在多行列表中查找项的索引

Erlang 在多行列表中查找项的索引,erlang,Erlang,我在一个文件列表上迭代,将内容存储在一个列表中,然后搜索单词“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

我在一个文件列表上迭代,将内容存储在一个列表中,然后搜索单词“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个小时后已经没有了主意://

您可以使用
列表:map
字符串:strip

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

7> lists:map(fun(E) -> string:strip(E) end, ["hello", " world"]).      
["hello","world"]

字符串
模块需要使用一个简单的列表。您正在传递一个列表列表。如果您的目标只是识别术语“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\u terms(“blue()”,Nlist)

调用它。这在没有换行符的自定义列表上有效,但在有换行符的列表上无效。。尝试逐行读取文件并将其存储到列表中,现在尝试在该列表中查找“blue”索引。。这不会发生:)@ace007:
string:tokens/2
实际上接受多个令牌字符,并且不关心它们的顺序,因此您可以在各种换行符上拆分,如:
string:tokens(string,“\r\n”)
关于第二个代码片段,我在哪里定义我要查找的单词?我该如何将它添加到我的代码中我必须在-export中声明这个函数,但是它需要多少参数,因为有3个相同的名称。。。erlang的新成员:)也不喜欢,修复了函数声明以包含搜索项。对于导出,您将执行
-export([find_terms/2])。
;第三个参数仅供内部使用,因此不需要公开它。但是,您可以使用相同的模型为可选参数提供默认值。把它想象成一条装配线:每一步都会添加一个所需的零件。只要函数采用不同数量的参数,就可以使用相同名称的函数。例如,要导出这两个查找术语功能,请执行:
-export([find\u terms/2,find\u terms/3])。
。此外,如果您还没有找到它,我强烈建议初学者使用此网站(也可以作为一本书提供):
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.