2

我有一个变量:

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.

请注意,消息不是作为元组发送的,它与 Data =

谁能带领我朝着正确的方向前进?

谢谢,晚安!-B

更新

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

所以如果我说

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.

我觉得我很接近,但不是 100%

-B

4

1 回答 1

2

更新OP 正在尝试将参数传递给函数而不是发送消息。

顾名思义,该receive块用于接收和处理发送给进程的消息。当您dataReceived使用参数调用时,它会继续等待消息。由于没有消息发送,它将继续无休止地等待。给定当前代码,如果您希望它执行某些操作,则必须生成该函数,获取进程 ID,然后向进程 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)将内部列表绑定到 name 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> 
于 2010-08-12T09:33:54.103 回答