进程间的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
中,我们首先检查是否已接收atom
stop
,如果已接收,则退出该函数。否则,我们将接收并检查
元素
,然后调用
递归检查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.