Erlang全文合法单词搜索程序

来源:互联网 发布:90年代经典网络歌曲 编辑:程序博客网 时间:2024/06/10 01:50

    合法单词,这里主要指原子和变量。

    代码如下:

    %%----------------------------------------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)拿出来就可以了。

   稍加改动,可以从文本中提取各种需要的模式。

原创粉丝点击