ERLANG - шаблон соответствия шаблону в списке неизвестных размеров - PullRequest
2 голосов
/ 13 августа 2010

Хорошо, теперь я думаю, что мне становится теплее, я должен соответствовать шаблону, что бы ни приходило.

Так что, если бы я сказал

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

1 Ответ

1 голос
/ 13 августа 2010

Вы можете извлечь ваши данные следующим образом:

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