1

我有如下数据:

Data = [{<<"status">>,<<"success">>},
       {<<"META">>,
       {struct,[{<<"createdat">>,1406895903.0},
       {<<"user_email">>,<<"gopikrishnajonnada@gmail.com">>},
       {<<"campaign">>,<<"5IVUPHE42HP1NEYvKb7qSvpX2Cm">>}]}},
       {<<"mode">>,1}]

现在我有一个

FieldList = ['<<"5IVUPHE42HP1NEYvKb7qSvpX2Cm">>']

现在:

我正在尝试如下所示,但我得到的是空的而不是值

90> [L || L <- FieldList,proplists:get_value(<<"campaign">>,element(2,proplists:get_value(<<"META">>,Data,{[],[]}))) == L].
[]

那么如何获得两个值相等并获得最终值。

4

3 回答 3

2

您可以将原子解析为 Erlang 术语:

atom_to_binary(Atom) ->
    L = atom_to_list(Atom),
    {ok, Tokens, _} = erl_scan:string(L ++ "."),
    {ok, Result} = erl_parse:parse_term(Tokens),
    Result.

然后你可以做

[L ||
   L <- FieldList,
   proplists:get_value(<<"campaign">>,
       element(2,
           proplists:get_value(<<"META">>,Data,{[],[]})))
   == atom_to_binary(L)
].

你也可以反过来做,(试图)使用这个函数将二进制文件转换为原子:

binary_literal_to_atom(Binary) ->
    Literal = lists:flatten(io_lib:format("~p", [Binary])),
    try
        list_to_existing_atom(Literal)
    catch
        error:badarg -> undefined
    end.

undefined如果原子未知,则此函数将返回(s. Erlang:binary_to_atom 填充原子表空间安全问题以获取更多信息)。这在这里很好,因为只有在原子之前已知的情况下匹配才能起作用,在这种情况下,通过在FieldList变量中定义。

你最初是如何获得这些价值观的?

于 2014-08-12T14:27:15.700 回答
0
Data = [{<<"status">>,<<"success">>},
        {<<"META">>,
            {struct,[{<<"createdat">>,1406895903.0},
                     {<<"user_email">>,<<"gopikrishnajonnada@gmail.com">>},
                     {<<"campaign">>,<<"5IVUPHE42HP1NEYvKb7qSvpX2Cm">>}]
            }
         },
         {<<"mode">>,1}].

[_,{_,{struct,InData}}|_] = Data.

[X || {<<"campaign">>,X} <- InData].

它以以下形式为您提供结果:[<<"5IVUPHE42HP1NEYvKb7qSvpX2Cm">>]

当然,如果元组 {struct,InData} 可能在 Data 变量中的不同位置,您可以使用相同类型的代码。

于 2014-08-12T19:24:57.463 回答
0
-module(wy).
-compile(export_all).

main() ->
    Data = [{<<"status">>,<<"success">>},
        {<<"META">>,
         {struct,[{<<"createdat">>,1406895903.0},
              {<<"user_email">>,<<"gopikrishnajonnada@gmail.com">>},
              {<<"campaign">>,<<"5IVUPHE42HP1NEYvKb7qSvpX2Cm">>}]
         }
        },
        {<<"mode">>,1}],
    Fun = fun({<<"META">>, {struct, InData}}, Acc) ->
          Value =  proplists:get_value(<<"campaign">>, InData, []),
          [Value | Acc];
         (_Other, Acc)->
          Acc
      end,
    lists:foldl(Fun, [], Data).

我认为您可以使用此代码。

于 2014-08-13T01:12:02.247 回答