进程间的Erlang消息传递
我正在编写代码,读取两个输入文件,并检查第一个文件中的单词是否存在于第二个文件中。我想通过进程消息传递逐个检查列表中的元素 这是我的密码:进程间的Erlang消息传递,erlang,erlang-shell,Erlang,Erlang Shell,我正在编写代码,读取两个输入文件,并检查第一个文件中的单词是否存在于第二个文件中。我想通过进程消息传递逐个检查列表中的元素 这是我的密码: start()-> Pid2 = spawn(?MODULE,check2,[]), spawn(?MODULE,check1,[Pid2]). check1(Pid2) -> {ok, Data} = file:read_file("input.txt"), B = binary:split(Data, [&l
start()->
Pid2 = spawn(?MODULE,check2,[]),
spawn(?MODULE,check1,[Pid2]).
check1(Pid2) ->
{ok, Data} = file:read_file("input.txt"),
B = binary:split(Data, [<<" ">>], [global]),
K = [binary_to_list(Item) || Item <- B],
[Pid2 ! Element || Element <- K].
check2() ->
{ok,IoDevice} = file:open("check.txt", [read]),
L = string:tokens(io:get_line(IoDevice,""), "! ."),
receive
Element ->
case lists:member(Element,L)of
true ->
io:format(Element);
false ->
io:format("not_ok")
end
end.
start()->
Pid2=spawn(?模块,检查2,[]),
产卵(?模块,检查1,[Pid2])。
检查1(Pid2)->
{ok,Data}=file:read_file(“input.txt”),
B=二进制:拆分(数据,[],[全局],
K=[二进制列表(项)| |项
案例列表:成员(元素,L)
正确->
io:格式(元素);
错误->
io:格式(“不确定”)
结束
结束。
问题是,当我想发送列表中的一个元素时,它只发送第一个元素。我如何修改代码以发送所有字符串并检查它们?主要问题是,您的
check2/0
函数只接收一个元素,然后退出。它需要循环来接收所有元素,并且还需要一些东西来检查告诉它何时停止。让我们从start/0
开始,逐个更改下面的函数:
start()->
Pid2 = spawn(?MODULE,check2,[]),
check1(Pid2).
这里的变化是不需要生成check2/1
——它可以直接由start/0
运行
接下来,我们修改了check1/1
函数:
check1(Pid2) ->
{ok, Data} = file:read_file("input.txt"),
B = binary:split(Data, [<<" ">>,<<"\n">>], [global,trim_all]),
K = [binary_to_list(Item) || Item <- B],
[Pid2 ! Element || Element <- K++[stop]].
请注意,我们已将原始的check2/0
拆分为两个函数:check2/0
和check2/1
。这是因为check2/1
函数必须是递归的,才能接收发送给它的所有元素:
check2(L) ->
receive
stop ->
ok;
Element ->
case lists:member(Element,L)of
true ->
io:format("found: ~s\n", [Element]);
false ->
io:format("not found: ~s\n", [Element])
end,
check2(L)
end.
请注意,在
receive
中,我们首先检查是否已接收atomstop
,如果已接收,则退出该函数。否则,我们将接收并检查元素
,然后调用递归检查2/1
,以便它可以接收下一个元素
或stop
atom @Steve Vinoski:我在这个问题上扩展得更好,这是我的代码,我希望你能看到我的错误…tnx非常感谢你的帮助,我还有一个问题,我正在尝试过滤找到的元素,比如如果找到的元素是这个列表的成员<代码>[“惊人”、“良好”、“伟大”、“有趣”、“美妙”、“有价值”、“超级”、“优秀”、“令人钦佩”,“awesome”]print 1否则,如果元素是此列表的成员,[“bad”、“垃圾”、“可怕”、“可怕”、“无聊”、“差”、“弱”、“不好”、“二流”]
print(-1)…我想在check 2/1中混合两个元素(例如)Station但它不起作用…您需要阅读并传递两个列表,一个是好条目,一个是坏条目。使用lists:member2
检查一个列表,就像您已经做的那样,但在未找到的情况下,使用另一个案例检查另一个列表,也使用lists:member/2
。
check2(L) ->
receive
stop ->
ok;
Element ->
case lists:member(Element,L)of
true ->
io:format("found: ~s\n", [Element]);
false ->
io:format("not found: ~s\n", [Element])
end,
check2(L)
end.