【问题标题】:test with loop in erlang在erlang中使用循环测试
【发布时间】:2013-02-12 05:01:58
【问题描述】:

我有一个值列表“Z0010”、“Z0011”、“Z0012”、“Z0013”、“Z0014”、“Z0015”、“Z0016”、“Z0017”、“Z0018”、“Z0019”

我想开发一个在参数中取值的函数

如果作为参数传递的值等于列表中的值,我想在我的函数中进行测试,在这种情况下,它将显示“存在”,否则显示“不存在”

我尝试:

test(Token)->
case get_user_formid_by_token(Token) of
                {ok, H} ->
                     FormId=string:substr(H, 2, length(H)),
                    Form=string:to_integer(FormId), 
                      case verify (0019,1,Form) of
                    {ok}->io:format("existe");
                    {notok}->io:format("not existe") 
                      end;

                {error, notfound}-> io:format("qq")

end.


verify(VariableLength,VariableIncrement,FormId)->


         lists:map(fun(I) -> if I =:= FormId ->
                             {ok};  
                             I =/= FormId ->
                          {notok}
                            end



                   end,
          lists:seq(0010, VariableLength, VariableIncrement)).

但是当我执行这段代码时,它会显示:

1> model:test("21137900").
** exception error: no case clause matching [{notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok}]
     in function  model:test/1

我现在试试这个解决方案:

get_user_formid_by_token(Token) ->
    Q = qlc:q([{X#person.formid} || X <- mnesia:table(person),
                X#person.token =:= Token]),
    case do(Q) of
        [{H}] ->
            {ok, H};
        [] ->
            {error, notfound}
    end.



    test(Token)->
    case get_user_formid_by_token(Token) of
                    {ok, H} ->
                        io:format("~s~n",[H]),
                         FormId=string:substr(H, 5, length(H)),
    io:format("~s~n",[FormId]),
                        Form=string:to_integer(FormId), 
                         io:format("~p~n",[Form]),
                         lists:member(Form, lists:seq(313, 320, 1));
                    {error, notfound}-> io:format("qq")

    end.

但是当我测试时,我在控制台中有这条消息:

1> model:test("21137900").
Z000313
313
{313,[]}
false

结果应该是 true 而不是 false

我认为 Form=string:to_integer(FormId), 在这种情况下不会返回 313

还有一件事我想在我的代码中添加

例如如果 H 等于 "Z000010" FormId=string:substr(H, 2, length(H)),

它返回“000010” 现在我想消除第一个不为空的整数之前的第一个零,所以 extarct 0000 1之前

【问题讨论】:

    标签: erlang


    【解决方案1】:

    lists:map/2 获取一个列表并创建一个具有相同数量值的新列表,因此您的 10 个值列表将转换为 10 个 {ok}{notok} 元组的列表。

    你可能想要lists:member/2

    5> lists:member(0, lists:seq(1, 3, 1)).               
    false
    6> lists:member(3, lists:seq(1, 3, 1)).
    true
    7> lists:map(fun(X) -> ok end, lists:seq(1, 3, 1)).
    [ok,ok,ok]
    

    【讨论】:

    • 我认为Form和313的值类型不一样
    【解决方案2】:

    查看文档 (http://www.erlang.org/doc/man/string.html#to_integer-1):

    to_integer(String) -> {Int, Rest} | {error, Reason}
    
    Types:
    String = string()
    Int = integer()
    Rest = string()
    Reason = no_integer | not_a_list
    

    所以to_integer 返回一个元组,其中包含从字符串中消耗的数字和字符串的其余部分。您甚至可以从测试输出中看出{313,[]} 的位置。为了获取绑定到Formvariable 的数字的值,您需要分解元组,这通常通过模式匹配来完成:

    {Form,_Rest}=string:to_integer(FormId)
    

    现在您的Form 将只包含号码313

    string:to_integer函数也会愉快地吃掉前导零:

    1> {Form, _} = string:to_integer("000010"), Form.
    10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多