合法单词,这里主要指原子和变量。
代码如下:
%%----------------------------------------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)拿出来就可以了。
稍加改动,可以从文本中提取各种需要的模式。
本文介绍了一个使用Erlang实现的简单文本解析程序,该程序能够从输入文本中提取合法单词并将其存储在一个字典中,最终输出这些单词。合法单词包括字母和下划线组成的字符串。
2651

被折叠的 条评论
为什么被折叠?



