ERLANG - 模式匹配未知大小列表中的特定模式

时间:2010-08-12 20:17:30

标签: erlang design-patterns matching

好的,现在我觉得我变暖了,我必须模仿匹配任何内容。

所以如果我说了

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

1 个答案:

答案 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).