【问题标题】:Find string in list - Erlang在列表中查找字符串 - Erlang
【发布时间】:2017-09-20 00:10:31
【问题描述】:

我正在尝试查找某些字符串是否真的在列表中。有我的代码:

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 的新手。

【问题讨论】:

    标签: string list erlang


    【解决方案1】:

    L1 是二进制文件列表,而FineDump 是字符串(Erlang 中的整数列表)。您需要将FineDump 转换为二进制文件才能使lists:member/2 调用正常工作。

    这应该可行:

    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">>
    

    【讨论】:

    • 请看我的编辑。您不需要为了连接整数和二进制而做所有这些string:substrio:format 的事情(如果二进制包含双引号或尖括号,这也是不正确的)。
    • 很好的解决方案,我尝试了很多方法来编写我的代码,所以我这样做了,复杂的方式。它奏效了,所以我很满意。但是你的方法好多了。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2022-07-07
    • 2011-08-31
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多