合法单词,这里主要指原子和变量。
代码如下:
%%----------------------------------------Get Words From Text-----------------------------------
f(L) ->
Dict=main(L,[]),
List=dict:fetch_keys(Dict),
lists:sort(List).
cl([H|T],Parent) ->
Parent!{H,is_letter(H)},
cl(T,Parent);
cl([],Parent) ->
Parent!over.
is_letter(H) ->
L="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM_",
case lists:member(H,L) of
true ->
true;
false ->
false
end.
main(L,L2) ->%%L2 is recommanded to be []
S=self(),
Dict0=dict:new(),
cl(L,S),
loop(L2,Dict0).
loop(L2,Dict) ->
receive
{H,true} ->
L3=[H|L2],
case dict:is_key(lists:reverse(L2),Dict) of
true ->
Dict0=dict:erase(lists:reverse(L2),Dict),
Dict1=dict:store(lists:reverse(L3),list,Dict0),
put(state,true),
loop(L3,Dict1);
false ->
Dict1=dict:store(lists:reverse(L3),list,Dict),
put(state,true),
loop(L3,Dict1)
end;
{_H,false} ->
case get(state) of
true ->
put(state,false),
loop([],Dict);
false ->
loop(L2,Dict);
undefined ->
put(state,false),
loop(L2,Dict)
end;
over ->
Dict
end.
这个程序是比较丑陋的,因为使用了进程字典,频繁改写状态,破坏了Erlang的优美特性。
程序的主要思想是开启一个进程去判断List中的每个字符是不是属于合法的字符(就是大小写加上下划线),将结果返回给主进程,主进程处理之后保存在搜集用的字典里,最后将键值(keys)拿出来就可以了。
稍加改动,可以从文本中提取各种需要的模式。