2010-08-12 99 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>