Обновление ОП пытается передать аргумент функции, а не отправлять сообщения.
Как видно из названия, блок 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>