zoukankan      html  css  js  c++  java
  • erlang string -> term,term->string

    如果不是用日志,我当前知道的erlang term-> string 的方式就是 io_lib:format,例如:

    A = io_lib:format("~p~p",["123",["321",123,123,{123,123}]]).
    [""123"",
     [91,
      [""321"",44,"123",44,"123",44,[123,["123",44,"123"],125]],
      93]]
    6> io:format("~ts", [A]).
    "123"["321",123,123,{123,123}]ok
    
    还有一个比较笨的方法是如下:any_to_list 做 ++ 处理,然后输出

    string -> erlang term 的方式是如下的函数 to_params_term/1,参数是string类型的 erlang term, 函数原型如下:

         1> {ok,Tokens,_} = erl_scan:string("[{foo,bar},x,3].").
            {ok,[{'[',1}, {'{',1}, {atom,1,foo}, {',',1}, {atom,1,bar},...
         2> {ok,Term} = erl_parse:parse_term(Tokens).
            {ok,[{foo,bar},x,3]}
            
    

    一些测试代码:

    -module(test).
    -compile(export_all).
    
    any_to_list(undefined) ->
        "";
    any_to_list(List) when is_list(List) ->
        List;
    any_to_list(Bin) when is_binary(Bin) ->
        case unicode:characters_to_binary(Bin, utf8, utf8) of
            Bin -> unicode:characters_to_list(Bin);
            _ -> binary_to_list(Bin)
        end;
    any_to_list(Atom) when is_atom(Atom) ->
        atom_to_list(Atom);
    any_to_list(Number) when is_integer(Number) ->
        integer_to_list(Number);
    any_to_list(Float) when is_float(Float) ->
        float_to_list(Float, [{decimals, 4},compact]);
    any_to_list(Tuple) when is_tuple(Tuple) ->
        tuple_to_list(Tuple);
    any_to_list(_) ->
        throw(badarg).
    
    to_string(ListTerm)  when is_list(ListTerm) ->
        to_string(ListTerm,"");
    to_string(Term)  ->
        to_string(any_to_list(Term)).  
    
    to_string([], R) -> 
        lists:reverse(R);
    to_string([H|T], R) ->
        Tile = ["
    "| R],
        to_string(T, [any_to_list(H) | Tile]);
    to_string(_, _)  ->
        {error,error_type}.
    
    %%当有深层次的嵌套时候就会把前面的字符串显示成数字,不知道怎么解决
    any_to_a_string(Term) -> 
        ListTest = any_to_list(Term),
        case ListTest of
            ListTest when is_list(ListTest) ->
             StringWithOddColon = 
                lists:foldl(fun(Number, Acc) ->
                                Acc ++ any_to_list(Number) ++ ","
                            end, "", ListTest) ,
                lists:droplast(StringWithOddColon);
            _ ->
               {error,error_type} 
        end.
    
    any_to_individual_string(Term) -> 
        ListTest = any_to_list(Term),
        case ListTest of
            ListTest when is_list(ListTest) ->
            [_H | ReversedString] =
                lists:foldl(fun(Number, Acc) ->
                                [any_to_list(Number) | Acc]
                            end, "", ListTest) ,
                lists:reverse(ReversedString);
            _ ->
                any_to_list(ListTest)
        end.
    
    
    to_params_term(String) ->
        case erl_scan:string(lists:append(String, ".")) of
            {ok, ScannedString, _ } ->
                case  erl_parse:parse_exprs(ScannedString) of 
                    {ok, ParsedString} ->
                        {value, Term, []} = erl_eval:exprs(ParsedString, []),
                        Term;
                    {error, Reason} ->
                        {error, Reason}
                end;
            {error, Reason, _} ->
                {error, Reason}
        end.
    

    测试:

    39> c(test).
    {ok,test}
    40> test:to_string([<<"abc123">>,123,53,67.54363,{<<"abc">>, <<"a12">>}]).
    ["
    ","abc123","
    ","123","
    ","53","
    ","67.5436","
    ",
     [<<"abc">>,<<"a12">>]]
    41> test:any_to_a_string([<<"abc123">>,123,53,67.54363,{<<"abc">>, <<"a12">>}]).
    [97,98,99,49,50,51,44,49,50,51,44,53,51,44,54,55,46,53,52,
     51,54,44,<<"abc">>,<<"a12">>]
    42> test:any_to_a_string([<<"abc123">>,123,53,67.54363,<<"abc">>, <<"a12">>]).  
    "abc123,123,53,67.5436,abc,a12"
    43> test:any_to_individual_string([<<"abc123">>,123,53,67.54363,<<"abc">>, <<"a12">>]).
    ["abc123","123","53","67.5436","abc"]
    44> test:to_params_term("["abc123","123","53","67.5436","abc"]").
     1: syntax error before: abc123
    44> test:to_params_term("[abc123,123,53,67.5436,abc]").           
    [abc123,123,53,67.5436,abc]
    

    参考资料:
    坚强2002的博客 From String To Erlang Code
    坚强2002的博客string To Erlang Term 一个更为考虑更为完善的方法,此处说的更详细
    [erlang类型转换](http://www.cnblogs.com/ShankYan/p/4141803.html)

  • 相关阅读:
    电脑桌面图标不显示图案变成白色图标该怎么办?
    行动上的巨人养成指南
    荣耀MagicBook Pro 2020款对比2019款做了哪些升级
    P8 function template ,函数模板
    MATLAB中imfill()函数
    MagicBook Pro 2020锐龙版
    P7. class template, 类模板,模板类
    6. namespace经验谈
    macbook pro2020参数
    MATLAB取整
  • 原文地址:https://www.cnblogs.com/ShankYan/p/4202397.html
Copyright © 2011-2022 走看看