Erlang Message passing between process -


i writing code reads 2 input files , checks if words in first file present in second file. want check elements of list 1 one via process message passing.

here code:

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. 

the problem when want send element of list, sends first element. how can modify code send strings , check them?

the primary issue check2/0 function receives single element , exits. needs loop receive elements, , needs tell when stop. let's change functions 1 one below, starting start/0:

start()->     pid2 = spawn(?module,check2,[]),     check1(pid2). 

the change here there's no need spawn check2/1 — can run directly start/0.

next, here's our revised check1/1 function:

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]]. 

first, added newline split pattern, , trim_all option rid of empty elements split. appended atom stop list of elements send pid2. let's @ our revised check2/0 function see why:

check2() ->     {ok,iodevice} = file:open("check.txt", [read]),     l = string:tokens(io:get_line(iodevice,""), "! .\n"),     check2(l). 

note we've split original check2/0 2 functions: check2/0 , check2/1. because check2/1 function has recursive can receive elements sent it:

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. 

notice inside receive first check see if we've received atom stop, , if do, exit function. otherwise, receive , check element, , after call check2/1 recursively can receive either next element or stop atom.


Comments