好的,现在我觉得我变暖了,我必须模仿匹配任何内容。
所以如果我说了
Message = = [[<<>>],
[<<"10">>,<<"171">>],
[<<"112">>,<<"Gen20267">>],
[<<"52">>,<<"20100812-06:32:30.687">>]]
我希望模式匹配字段&lt;&lt;“112”&gt;&gt;
如112总是会说112,但Gen2067可以随时改变......它的数据,它将存储在一个变量中。
此外,字段可以按任何顺序排列,无论我尝试做什么功能都必须能够找到字段并解析它。
这是我现在正在使用的代码:
loop() ->
receive
[_,[<<"112">>, Data], _] when is_list(X) -> %% Just dosen't work in anyway..
?DEBUG("Got a list ~p~n", [X]),
loop();
_Other ->
?DEBUG("I don't understand ~p~n", [_Other]),
loop()
end.
我觉得我很接近,但不是100%
-B
答案 0 :(得分:1)
您可以通过这种方式提取数据:
1> Message = [[<<>>],
1> [<<"10">>,<<"171">>],
1> [<<"112">>,<<"Gen20267">>],
1> [<<"52">>,<<"20100812-06:32:30.687">>]] .
[[<<>>],
[<<"10">>,<<"171">>],
[<<"112">>,<<"Gen20267">>],
[<<"52">>,<<"20100812-06:32:30.687">>]]
2> [Data] = [X || [<<"112">>, X] <- Message ].
[<<"Gen20267">>]
3> Data.
<<"Gen20267">>
另一种方式:
4> [_, Data] = hd(lists:dropwhile(fun([<<"112">>|_]) -> false; (_)->true end, Message)).
[<<"112">>,<<"Gen20267">>]
5> Data.
<<"Gen20267">>
另一个作为模块中的功能(可能是最快的):
% take_data(Message) -> Data | not_found
take_data([]) -> not_found;
take_data([[<<"112">>, Data]|_]) -> Data;
take_data([_|T]) -> take_data(T).