2

好的,现在我想我越来越暖和了,我必须匹配任何进来的东西。

所以如果我说

Message = = [[<<>>], 
 [<<"10">>,<<"171">>],
 [<<"112">>,<<"Gen20267">>],
 [<<"52">>,<<"20100812-06:32:30.687">>]] 

我正在寻找模式匹配字段 <<"112">>

例如 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

4

1 回答 1

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).
于 2010-08-12T22:21:18.737 回答