ERLANG - сопоставление с образцом - PullRequest
2 голосов
/ 12 августа 2010

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

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

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.

Я чувствую себя рядом, но не на 100%

-B

1 Ответ

2 голосов
/ 12 августа 2010

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

Как видно из названия, блок 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> 
...