ERLANG - сопоставление с образцом

У меня есть переменная:

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

Я пытаюсь найти совпадение по образцу для двух конкретных случаев.

Тот, где все, что напоминает внешнюю структуру - просто [] Что-нибудь внутри идет. Я пробовал [ _ ], но не вышло?

Во-вторых, для особого рисунка внутри, например, когда я вижу «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


person BAR    schedule 12.08.2010    source источник
comment
@ user417896: Думаю, вы путаете аргументы и сообщения. См. Мой обновленный ответ.   -  person Manoj Govindan    schedule 12.08.2010


Ответы (1)


Обновить OP пытается передать аргумент функции, а не отправлять сообщения.

Как видно из названия, блок receive используется для приема и обработки сообщений, отправленных процессу. Когда вы вызываете dataReceived с аргументом, он продолжает ждать сообщений. Поскольку сообщения не отправляются, он будет продолжать бесконечно ждать. Учитывая текущий код, если вы хотите, чтобы он что-то делал, вам нужно будет создать функцию, получить идентификатор процесса и затем отправить сообщение идентификатору процесса.

Возможно, вам понадобится функция, в которой аргумент соответствует шаблону, а не сообщения.

Что-то вроде этого:

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> 
person Manoj Govindan    schedule 12.08.2010