2010-08-12 58 views
2

好了,現在我覺得我逐漸回暖specifc模式,我有什麼進來的模式匹配二郎山 - 模式匹配未知大小列表

所以,如果我不得不說

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

而且我一直在尋找。模式匹配該字段< <「012」>>

如112總是會說112,但是Gen2067可以隨時更改..其數據,它將被存儲在一個變量中。

此外,字段可以以任何順序,無論函數試圖做什麼都必須能夠找到字段並解析它。

這是我使用的是現在的代碼:我覺得IM接近

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

的可能重複的[ERLANG - 模式匹配(http://stackoverflow.com/questions/3465317/erlang-pattern-matching ) – 2010-08-12 20:28:05

+0

有人可以重寫這個嗎?這不會像英文那樣解析:「如112總是會說112,但Gen2067可以隨時改變......它的數據,它將被存儲在一個變量中。」 – Gabe 2010-08-13 04:09:35

回答

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