【问题标题】:find index of item in multiline List在多行列表中查找项目索引
【发布时间】:2013-01-07 10:01:57
【问题描述】:

我正在遍历文件列表,将内容存储在列表中,然后在该列表中搜索单词“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 小时后我已经没有想法了: /

【问题讨论】:

    标签: erlang


    【解决方案1】:

    您可以使用 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"]
    

    【讨论】:

    • 已经尝试过了,这适用于没有换行符的自定义列表 \r\n 但它不适用于有换行符的列表.. 尝试逐行读取文件并将其存储到一个列表,现在尝试在该列表中找到“蓝色”的索引.. 它不会发生:)
    • @ace007: string:tokens/2 实际上接受多个标记字符并且不关心它们的顺序,因此您可以像这样拆分各种换行符:string:tokens(String, "\r\n")
    【解决方案2】:

    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)来称呼它

    【讨论】:

    • 关于第二段代码,我在哪里定义我正在寻找的词?以及如何将其添加到我的代码中,我必须在 -export 部分中声明此函数,但是它需要多少个参数,因为有 3 个同名... erlang 的新手 :) 也不喜欢它,,
    • 修复了函数声明以包含搜索词。对于你的出口,你会做-export([find_terms/2]).;第三个参数仅供内部使用,因此您不需要公开它。但是,您可以使用相同的模型为可选参数提供默认值。把它想象成一条装配线:每一步都增加了一个必需的部分。只要它们采用不同数量的参数,具有相同名称的函数就可以了。例如,要导出两个 find_terms 函数,请执行以下操作:-export([find_terms/2, find_terms/3]).
    • 另外,如果你还没有找到它,我强烈推荐这个网站给初学者(也可以作为一本书):learnyousomeerlang.com
    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 2014-10-13
    • 2023-02-11
    • 2010-09-15
    • 2018-07-31
    • 1970-01-01
    • 2020-07-20
    • 2012-01-10
    相关资源
    最近更新 更多