2010-08-12 100 views
1

我有一個變量:二郎山 - 模式匹配

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

我試圖模式匹配了兩個具體的案例..

一個地方的任何類似的外部結構 - 簡單的[] 裏面什麼去我試過[ _ ],但沒有去?

第二,對於特定的圖案的內部,當我看到< <「10」等>>或< <「112」 >>或< <「52」 >>然後我要採取右側這是一個原子的實際數據。 基本上< <「10」>>或< <「112」>>或< <「52」>>是字段,右邊是數據。

我曾嘗試之類的語句[<<"10">>, _ ]仍然沒有去

這裏是代碼的其餘部分:

dataReceived(Message) -> 
    receive 
     {start} -> 
      ok; 

     [ _ ] -> %%No go 
      io:format("Reply 1 = ~p~n", [Message]); 

       [<<"10">>, _ ] -> %%No go 
      io:format("Reply 1 = ~p~n", [Message]) 


    end. 

作爲一個說明該消息不發送一個元組是完全一樣的數據=

任何人都可以帶領我走向正確的方向嗎?

謝謝,晚安! -B

UPDATE

好了,現在我覺得我逐漸回暖,我不得不模式匹配任何用武之地。

所以,如果我不得不說

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

而且我尋找模式匹配的領域< <「112」>>

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

loop() -> 
receive 
    [_,[<<"112">>, Data], _] when is_list(X) -> %% Match a list inside another. 
     ?DEBUG("Got a list ~p~n", [X]), 
     loop(); 
    _Other -> 
     ?DEBUG("I don't understand ~p~n", [_Other]), 
     loop() 
end. 

我覺得IM接近,但不是100%

-B

+0

@ user417896:我認爲你是混淆的論據和消息。看到我更新的答案。 – 2010-08-12 18:03:49

回答

2

更新 OP試圖將參數傳遞給函數,而不是發送消息。

正如名稱所示,receive塊用於接收和處理髮送到進程的消息。當您用參數呼叫dataReceived時,它會繼續等待消息。由於沒有消息發送,它將繼續無休止地等待。如果您想要它執行某些操作,請給出當前代碼,然後您必須生成函數,獲取進程ID,然後將消息發送到進程標識。

您可能需要一個功能,其中參數是模式匹配的,而不是消息

事情是這樣的:

dataReceived([Message]) when is_list(Message) -> 
    io:format("Got a list as arg ~p~n", [Message]); 
dataReceived(_Other) -> 
    io:format("Unknown arg ~p~n", [_Other]). 

在一個側面說明你的第三個模式[X] when is_list(X)永遠比不上爲第二圖案爲第三的超集。任何匹配[X] when is_list(X)的東西將始終匹配[X],因此您的第三個匹配子句將永遠不會被觸發。

原來的答案

我不知道我理解你的問題。你正在試圖發送一個消息給函數,還是你傳遞了一個參數?

這是關於如何匹配清單列表的部分答案,如果您是發送消息

-module(mtest). 
-export([run/0]). 

-ifdef(debug). 
-define(DEBUG(Format, Args), io:format(Format, Args)). 
-else. 
-define(DEBUG(Format, Args), void). 
-endif. 

loop() -> 
receive 
    [X] when is_list(X) -> %% Match a list inside another. 
     ?DEBUG("Got a list ~p~n", [X]), 
     loop(); 
    _Other -> 
     ?DEBUG("I don't understand ~p~n", [_Other]), 
     loop() 
end. 

看看receive塊中的第一個子句。 [X] when is_list(X)將把內部列表綁定到名稱X。我用你提供的價值Data測試它,它工作。

%% From the shell. 
1> c(mtest, {d, debug}). 
{ok,mtest} 
2> Pid = mtest:run(). 
<0.40.0> 
3> Data = [[<<>>, [<<"10">>,<<"171">>], [<<"112">>,<<"Gen20267">>], [<<"52">>,<<"20100812-06:32:30.687">>]]]. 
[[<<>>, 
    [<<"10">>,<<"171">>], 
    [<<"112">>,<<"Gen20267">>], 
    [<<"52">>,<<"20100812-06:32:30.687">>]]] 
4> Pid ! Data. 
[[<<>>, 
    [<<"10">>,<<"171">>], 
    [<<"112">>,<<"Gen20267">>], 
    [<<"52">>,<<"20100812-06:32:30.687">>]]] 
Got a list [<<>>, 
      [<<"10">>,<<"171">>], 
      [<<"112">>,<<"Gen20267">>], 
      [<<"52">>,<<"20100812-06:32:30.687">>]] 
5>