精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Erlang實戰文本排版

開發 開發工具
本文主要是通過Erlang實現簡單的文本排版,借此學習Erlang、熟悉Erlang。希望對大家有所幫助。

文本排版大家都并不陌生,并且隨處可見,無論是當前的字處理軟件,如Word、PDF等,還是傳統的出版行業,如:書籍、報刊、雜志等,都有良好的排版風格和樣式。好的排版風格讓人耳目一新,有一種繼續讀下去的沖動。本文主要是通過Erlang實現簡單的文本排版,借此學習Erlang、熟悉Erlang。

  實戰:文本排版。

  要求如下:

  在代碼中我附了注釋,代碼如下:

  1. -module(text_process).  
  2. -export([process/2]).  
  3. -import(lists,[reverse/1]).  
  4.  
  5. process(FileIn,FileOut) ->  
  6.     {Status,Value} = file:open(FileIn,read),  
  7.     if 
  8.         Status =:= ok ->  
  9.             Tokens = readFile(Value), %% 將要處理文本FileIn拆分為單詞列表  
  10.             io:format("token :~p~n",[Tokens]),  
  11.             writeToFile(FileOut,Tokens), %% 將單詞重新排版輸出到屏幕與文件FileOut  
  12.             io:format("~nsuccess!~n");  
  13.         Status =/= ok ->  
  14.             io:format("Open file error: file doesn't exist!")  
  15.     end.      
  16.       
  17. readFile(Value) -> readFile(Value,[]).  
  18.  
  19. readFile(S,Dict) ->  
  20.     OneLine = io:get_line(S,''), %%讀取文件的一行  
  21.     if 
  22.         OneLine =:= eof ->  
  23.              io:format("~nCome across the file end, stop!~n"),  
  24.              file:close(S),  
  25.              Dict;  
  26.         OneLine =/= eof ->  
  27.             Tokens = string:tokens(OneLine,"\r\t\n "),  %%以空格、回車、換行、制表符為單詞分隔符  
  28.             Len = string:len(Tokens),  %%獲得字符串的長度  
  29.             if 
  30.                 Len =:= 0 ->  %%遇到空行,停止處理  
  31.                     io:format("~nCome across blank line, stop!~n"),  
  32.                     file:close(S),  
  33.                     Dict;  
  34.                 Len =/= 0 ->  
  35.                     NewDict = string:concat(Dict,Tokens), %% 將Tokens連接到Dict尾  
  36.                     readFile(S,NewDict) %%未讀到空行、EOF,繼續讀取文本  
  37.             end  
  38.     end.  
  39.  
  40. writeToFile(FileOut,Tokens) ->  
  41.     {ok,S} = file:open(FileOut,write),  
  42.     Data = parse(Tokens,[]),  
  43.     String  = lineToPara(Data),  
  44.     io:format("~n~s~n",[String]),  %% 輸出到屏幕  
  45.     io:format(S,"~s~n",[String]). %% 輸出到文件  
  46.     %lists:foreach(fun({X}) -> io:format(S,"~s~n",[X]) end, Data).          
  47.  
  48. lineToPara(Data) -> lineToPara(Data,"").  
  49.  
  50. lineToPara([],Ret) -> Ret;  
  51. lineToPara(Data,Ret) ->  
  52.     Last = lists:nth(1,Data),  
  53.     Element = element(1,Last),  
  54.     Temp = Ret ++ Element ++ "\n",  
  55.     %io:format("~s",[Temp]),  
  56.     lineToPara(lists:delete(Last,Data), Temp).  
  57.  
  58. %%解析單詞列表  
  59. parse(Tokens,Contents) ->  
  60.     M =50,  
  61.     {ALine,RemainToken} = parse_line(Tokens,M),  
  62.     if 
  63.         length(RemainToken) =:= 0 ->  
  64.             Plain = plain(ALine),  
  65.             io:format("last line----:~s~n",[Plain]),  
  66.             NewContent = lists:append(Contents,[{Plain}]);  
  67.         length(RemainToken) =/= 0 ->  
  68.             NewContent = lists:append(Contents,[{ALine}]),  
  69.             parse(RemainToken,NewContent)  
  70.     end.  
  71.  
  72. plain(Last) ->plain(Last, "").  
  73.       
  74. plain([], String) -> String;  
  75. plain(L, String) ->  
  76.     if 
  77.         length(L) =:= 1 ->  
  78.             Last = lists:nth(1,L),  
  79.             NewS = string:concat(String,Last);  
  80.         length(L) =/= 1 ->  
  81.             First = lists:nth(1,L),  
  82.             Temp = string:concat(First," "),  
  83.             NewS = string:concat(String,Temp),  
  84.             plain(lists:delete(First,L), NewS)  
  85.     end.  
  86.  
  87. parse_line(Tokens,M) -> parse_line(Tokens,M,[]).  
  88.  
  89. %% @ Tokens: 當前剩余單詞個數  
  90. %% @ M:每行***字符閥值  
  91. %% @ Line: 當前單詞行列表  
  92. parse_line([],_M,Line) -> {Line,[]};  
  93. parse_line(Tokens,M,Line) ->  
  94.     if 
  95.         length(Line) =:= 0 ->  
  96.             Element = lists:nth(1,Tokens),  
  97.             NewL = length(Element),  
  98.             NewToken  = lists:delete(Element,Tokens),  
  99.             parse_line(NewToken,M,[Element]);  
  100.         length(Line) =/= 0 ->  
  101.             Element = lists:nth(1,Tokens),  
  102.             NewL = len(Line)+length(Element)+length(Line),  
  103.             case NewL > M of  
  104.                     true ->  
  105.                         String = toString(Line,M),  
  106.                         {String,Tokens};  
  107.                     false ->  
  108.                         NewLine = lists:append(Line,[Element]),  
  109.                         NewToken = lists:delete(Element,Tokens),  
  110.                         parse_line(NewToken,M,NewLine)  
  111.             end  
  112.     end.  
  113.  
  114. %% 排版輸出當前行Line數據  
  115. toString(Line,M) ->   
  116.     Len = len(Line),  
  117.     Blank = M - Len,  
  118.     %io:format("Blank:~p Len:~p length(Line):~p ~n",[Blank,Len,length(Line)]),  
  119.     Ret = justify(Line,Blank,length(Line)),  
  120.     io:format("Mess------Ret:~s length:~p~n",[Ret,length(Ret)]),  
  121.     Ret.  
  122.       
  123. justify(Line,Blank,Len) -> justify(Line,Blank,Len,"").  
  124.  
  125. %% @Line: 一行字符串數據  
  126. %% @Blank:需要的空格個數  
  127. %% @Len: 當前行中剩余的單詞個數  
  128. %% @String: 返回一行矯正結果  
  129. justify(Line,Blank,Len,String) ->  
  130.     if 
  131.         length(String) =:= 0 ->  %%初始情況  
  132.             Temp = lists:nth(1,Line),  
  133.             Avg = Blank div Len, %% 計算單詞之間平均需要Avg個空格字符  
  134.             NewLine = lists:delete(Temp,Line),  
  135.             %io:format("1---avg: ~p Blank:~p  Len: ~p~n",[Avg,Blank,Len]),  
  136.             case Avg =:= 0 of  
  137.                 true ->  
  138.                     NewS = while(1,Temp),  
  139.                     justify(NewLine,Blank-1,length(NewLine),NewS);  
  140.                 false ->  
  141.                     NewS = while(Avg,Temp),  
  142.                     justify(NewLine,Blank-Avg,length(NewLine),NewS)  
  143.             end;  
  144.         length(String) =/= 0 ->   
  145.             if 
  146.                 length(Line) =:= 1 -> %%一行中***一個單詞,返回結果  
  147.                     Last = lists:nth(1,Line),  
  148.                     NewS = while(Blank,String), %%將剩余的Blank個字符補全  
  149.                     string:concat(NewS,Last);  
  150.                 length(Line) =/= 1 ->  
  151.                     First = lists:nth(1,Line),  
  152.                     Avg = Blank div Len,  
  153.                     NewLine = lists:delete(First,Line),  
  154.                     %io:format("2---avg: ~p Blank:~p  Len: ~p~n",[Avg,Blank,Len]),  
  155.                     case Avg =:= 0 of  
  156.                         true ->  
  157.                             NewS = while(1,String),  
  158.                             justify(NewLine,Blank-1,length(NewLine), string:concat(NewS,First));  
  159.                         false ->  
  160.                             NewS = while(Avg,String),  
  161.                             justify(NewLine,Blank-Avg,length(NewLine), string:concat(NewS,First))  
  162.                     end  
  163.             end  
  164.     end.  
  165.  
  166. %% 功能: 子字符串后面加Count個空格  
  167. while(0,String) -> String;  
  168. while(Count,String) ->  
  169.     NewS = string:concat(String," "),  
  170.     while(Count-1,NewS).  
  171.  
  172. %%統計一行中字符的個數(只包括單詞字符,不包括空格)  
  173. len(Line) -> len(Line,0).  
  174.  
  175. len([],Len) -> Len;  
  176. len([H|T],Len) ->  
  177.     len(T,Len+length(H)). 

看起來比較復雜,其實思路比較簡單:

1.將文本切分單詞列表;

2.設定一個閥值M,將每行的字符設置為M,同時必須保證單詞不能分割;

我覺得此程序的難度主要是設定單詞與單詞之間的空格字符的問題,我的思路是:根據每行中所有單詞所占的字符個數不同,求出單詞之間空格的平均Avg個數,一般情況,單詞與單詞之間的字符個數為1,因此justify/4很好的處理了這個問題。

程序運行結果示意圖如下:

test.txt文件內容:

結果如下:

  好了,文檔排版Erlang實戰就到此為止了。說個小問題,我在Erlang實戰:楊輝三角、選擇排序、集合交與并中的實戰2:選擇排序中不是用了兩次列表逆置來講一個元素加入到列表尾嗎,其實Erlang中模塊lists:append可以解決這個問題,我在本文代碼中多次用到了這個函數,如:NewLine = lists:append(Line,[Element]),意思就是講Element元素加入到列表尾,但是append函數的兩個參數必須都為列表,因此Element元素需以列表形式加入:[Element],可見世上存在這樣一條真理:只有你不知道的,沒有不可能發生的。

原文:http://www.cnblogs.com/itfreer/archive/2012/05/08/Erlang_in_practise_text-process.html

【編輯推薦】

  1. Erlang之父Joe Armstrong訪談:程序調試與啤酒
  2. Scala和Erlang,以及多核主導的未來
  3. Erlang面向分布與并發的編程語言
  4. 看Erlang中Actor模型的執行方式和優劣
  5. Erlang視點:并行計算和云計算
責任編輯:彭凡 來源: 博客園
相關推薦

2012-05-07 15:32:46

Erlang

2012-05-14 13:58:19

Erlang

2021-02-26 20:01:30

LaTex排版LaTeX排版

2025-02-12 00:35:24

WinForm框架工具

2010-09-10 14:54:12

DIV排版

2010-09-17 14:13:20

SIP業務Erlang

2021-02-24 16:50:07

LaTex排版表格

2021-02-24 16:15:20

LaTeX排版LaTeX列表

2012-05-07 08:47:25

Erlang

2023-11-20 22:07:51

PythonPDF

2021-09-27 14:44:48

鴻蒙HarmonyOS應用

2014-12-08 14:15:48

Material De字體排版

2021-02-20 20:58:04

LaTeXTeXstudio排版文檔

2012-08-16 09:07:57

Erlang

2009-07-30 10:59:44

Scala和Erlan多核

2010-03-22 14:45:40

云計算

2009-04-22 09:20:26

Erlang并發函數式

2010-09-08 17:20:42

CSS

2012-12-28 14:23:12

Android開發TextView

2010-09-14 10:41:24

DIV+CSS排版
點贊
收藏

51CTO技術棧公眾號

国产精品99久久不卡二区| 女人丝袜激情亚洲| 亚洲国产视频一区二区| 国产自产精品| 中文字幕在线观看欧美| 91中文字幕精品永久在线| 欧美第一区第二区| 不卡影院一区二区| 91三级在线| 国产亚洲综合在线| 99电影网电视剧在线观看| 日日摸天天添天天添破| 91成人网在线观看| 亚洲人成伊人成综合网久久久| 天天操精品视频| 欧美最新精品| 中文字幕一区二区三区乱码在线 | 中文字幕在线观看日韩| 五月天丁香社区| 欧美在线se| 色婷婷精品久久二区二区蜜臂av | 精品一区二区国产| 99精品在线视频观看| 久久久久久黄| 欧美风情在线观看| 一本色道久久88| 亚洲人和日本人hd| 亚洲精品在线三区| 久久精品亚洲天堂| 日韩亚洲国产免费| 欧美午夜不卡视频| 国产成人精品视频免费看| 三级资源在线| 亚洲人成网站在线| 亚洲午夜精品一区二区| 国产中文字幕在线观看| 久久香蕉国产线看观看99| 国产精品免费一区二区| 国内精品久久久久久久久久| 精品一区二区三区香蕉蜜桃| 国产精品免费久久久久影院| 4438国产精品一区二区| 亚洲综合国产| 欧美一级视频免费在线观看| 日本免费在线播放| 国内精品久久久久久久影视麻豆| 久久在线精品视频| 日本中文在线视频| 91国语精品自产拍| 精品国产一区二区三区久久狼黑人 | 久久久久青草大香线综合精品| 国产区二精品视| 欧美综合视频在线| 99精品国产视频| 精品免费一区二区三区蜜桃| 天天操天天干天天操| caoporn国产一区二区| 国产免费一区二区| 亚欧洲精品视频| 2014亚洲片线观看视频免费| 蜜桃成人在线| 国产精品一级伦理| 国产精品网站在线播放| 中文字幕中文字幕在线中心一区| 黄色网在线免费看| 亚洲在线观看免费| 欧美日韩在线一| 欧美极品免费| 欧美人与禽zozo性伦| 国产精品区在线| 国产精品毛片无码| 亚洲国产欧美一区二区丝袜黑人| 成人h动漫精品一区| 久久99性xxx老妇胖精品| 在线成人免费网站| 欧美色视频一区二区三区在线观看| 欧美成人直播| 欧美丰满老妇厨房牲生活| 国产系列精品av| 久久狠狠一本精品综合网| 国产精品主播视频| 精品久久国产视频| 2021久久国产精品不只是精品| 日日噜噜噜噜夜夜爽亚洲精品| 日本天堂在线观看| 亚洲国产综合视频在线观看| 国产主播中文字幕| 亚洲人成777| 亚洲国产精品中文| 国产在线免费av| 国产精品videosex极品| 国产精品99免视看9| 精品国产999久久久免费| 99精品久久久久久| 樱花www成人免费视频| av女在线播放| 欧美日韩国产影片| 老熟妇精品一区二区三区| 欧美日韩精品在线一区| 九九热精品在线| 中文字幕av第一页| 懂色av一区二区三区蜜臀| 日本不卡高清视频一区| 宅男网站在线免费观看| 色88888久久久久久影院野外| www.偷拍.com| 国产成人ay| 午夜欧美不卡精品aaaaa| 中文字幕在线观看视频一区| 91免费看片在线观看| 国产又大又长又粗又黄| 美女18一级毛片一品久道久久综合| 日韩一级二级三级| 欧美色图亚洲激情| 黄色亚洲在线| 成人免费淫片aa视频免费| 可以在线观看的av网站| 亚洲国产色一区| 1314成人网| 欧美aaaa视频| 国产精国产精品| 天天色综合久久| 尤物av一区二区| 中文字幕第22页| 成人久久电影| 国产精品www| 内衣办公室在线| 欧美日韩一区二区在线播放| 在线观看免费视频国产| 自拍偷拍欧美专区| 成人黄在线观看| 欧美精品电影| 欧美精品久久久久久久多人混战| 国产呦小j女精品视频| 亚洲作爱视频| 精品国产福利| 678在线观看视频| 91精品国产色综合久久| 二区三区四区视频| 精品一区二区三区视频| 黄瓜视频免费观看在线观看www| 日韩一区二区三区免费视频| 一区二区三区天堂av| 免费看污视频的网站| 久久日一线二线三线suv| 欧美极品欧美精品欧美图片| 神马日本精品| 日韩免费av在线| 国产污视频在线| 欧美日韩一区久久| 老司机精品免费视频| 捆绑变态av一区二区三区| 亚洲三级一区| 久久久精品区| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲免费不卡视频| 午夜精品视频在线观看| 欧美性xxxx图片| 日韩av电影天堂| 在线不卡日本| 韩国三级成人在线| 久久免费国产视频| 日韩大胆人体| 欧美日韩一卡二卡| 国产性xxxx| 99麻豆久久久国产精品免费| 红桃av在线播放| 日韩视频在线观看| 亚洲最大的av网站| 欧美videossex| 日韩精品在线免费观看视频| 最近中文在线观看| 自拍偷拍亚洲综合| 午夜av免费看| 蜜桃视频免费观看一区| 成年丰满熟妇午夜免费视频| 欧美日韩一区二区三区四区不卡 | 亚洲精选在线视频| 喷水视频在线观看| 久久国产三级精品| 久久99久久久久久| 精品一区二区三| 亚洲伊人久久综合| 麻豆理论在线观看| 日韩在线观看免费全| 免费看黄色一级视频| 在线免费观看成人短视频| 极品颜值美女露脸啪啪| 久久久一区二区| 中文字幕乱码在线人视频| 国产精品日本欧美一区二区三区| 亚洲一区二区三区加勒比| 高清精品视频| 国产噜噜噜噜久久久久久久久| 青春草免费在线视频| 中文字幕av一区中文字幕天堂| 国内精品国产成人国产三级| 欧美在线观看18| 国产午夜福利精品| 国产精品视频在线看| 国产性生活毛片| 激情久久久久久久久久久久久久久久| 国自产拍偷拍精品啪啪一区二区| 欧美国产美女| 欧美福利一区二区三区| 亚洲欧洲国产精品一区| 国产极品jizzhd欧美| 三级在线看中文字幕完整版| 欧美精品免费在线| av中文字幕在线| 国产婷婷色综合av蜜臀av| 精品毛片在线观看| 欧美日韩一区在线观看| 国产成人一级片| 亚洲18色成人| 黄色片在线观看网站| 国产色产综合产在线视频| 精品国产av色一区二区深夜久久| 国产在线视频一区二区| 香蕉视频禁止18| 日日夜夜精品视频免费| 内射国产内射夫妻免费频道| 国产精品v日韩精品v欧美精品网站| 最新欧美日韩亚洲| 日韩欧美视频| 五月婷婷综合色| 视频一区欧美| 久久久久天天天天| 精品欧美午夜寂寞影院| 成人性色av| 天堂久久av| 97超级碰碰| 麻豆国产一区| 91gao视频| 视频二区欧美毛片免费观看| 91精品中文在线| 一级欧美视频| 成人深夜直播免费观看| 国产精品777777在线播放| 国产欧美精品va在线观看| 美女写真久久影院| 日韩av男人的天堂| 欧美大胆成人| 国产成人福利视频| 亚洲第一会所| 国产精品视频一区二区高潮| 日韩一级二级| 国产精品视频一区国模私拍 | 国产乱码一区| 群体交乱之放荡娇妻一区二区| 久久99欧美| 深爱激情综合网| 一本久道久久综合| 亚洲成av人片乱码色午夜| 欧美三级午夜理伦三级老人| 亚洲欧美综合| 免费无码毛片一区二三区| 亚洲综合国产| 久久黄色片网站| 国产精品88888| 久久久久亚洲无码| 久久网这里都是精品| 天天舔天天操天天干| 日韩理论片网站| 久久久久久久伊人| 色综合天天综合色综合av| 中文区中文字幕免费看| 7777精品伊人久久久大香线蕉超级流畅 | 日本一区二区动态图| 国精品人伦一区二区三区蜜桃| 亚洲欧美视频在线观看视频| 久久精品99久久久久久| 欧美日韩在线视频一区| 中文在线a天堂| 日韩欧美中文字幕制服| 亚洲 欧美 自拍偷拍| 中文字幕日韩欧美在线| 超碰超碰在线| 69av视频在线播放| 黄色成人小视频| 国产高清自拍一区| av中文一区| 日韩精品在线视频免费观看| 肉丝袜脚交视频一区二区| 思思久久精品视频| 99久久伊人网影院| 国产尤物在线播放| 高跟丝袜欧美一区| 一区二区日韩视频| 日韩二区三区在线| 三级外国片在线观看视频| 久久久久久久久久久免费| a成人v在线| 国产免费一区二区| 希岛爱理一区二区三区| 日韩精品一区二区三区久久| 国产一级精品在线| 强伦人妻一区二区三区| 一区二区三区四区视频精品免费| 蜜臀尤物一区二区三区直播| 精品卡一卡二卡三卡四在线| 国产在线一二三| 久久久久国产精品www| 日本亚洲欧洲无免费码在线| 欧美人xxxxx| 精品69视频一区二区三区Q| 性生活免费在线观看| 久久综合色综合88| 欧美日韩成人免费观看| 欧美日韩电影在线| 你懂的在线看| 午夜精品一区二区三区视频免费看| 日韩伦理一区二区| 日韩免费av一区二区三区| 99热这里只有成人精品国产| 亚洲av无码久久精品色欲| 国产精品久久久久久久蜜臀| 中文字幕一区二区人妻电影| 精品国内二区三区| 在线观看免费视频你懂的| 国产中文日韩欧美| 不卡在线一区二区| 日韩精品视频久久| 波波电影院一区二区三区| 欧美成人精品一区二区免费看片 | 国产精品久久久久不卡| 欧美xxxx在线| 成人福利视频| 欧美性生活久久| 欧美一区二区黄片| 久久高清视频免费| 国产精品久久亚洲不卡| 久久久久无码国产精品一区| 精品999网站| 曰本三级日本三级日本三级| 日韩理论片在线| 国产精品探花视频| 久久久精品欧美| 国产美女视频一区二区| 中文字幕一区二区中文字幕 | 欧美丰满少妇xxxxx做受| 国产精品日本一区二区三区在线 | 国产亚洲精品精品精品| 欧美视频自拍偷拍| 国产大学生校花援交在线播放| 日本精品免费一区二区三区| 亚洲色图美女| 人人爽人人av| 国产精品久久久久永久免费观看| 在线观看色网站| 久久久成人av| 日韩一区免费| 国产3p露脸普通话对白| 91色九色蝌蚪| 国产成人自拍偷拍| 在线精品国产成人综合| 欧美亚洲综合视频| 偷拍盗摄高潮叫床对白清晰| 国产馆精品极品| 亚洲精品黄色| 国产特级黄色大片| 91麻豆国产自产在线观看| 影音先锋在线国产| 国产一区二区欧美日韩| 久久久久毛片| 欧美美女黄色网| www.亚洲色图| 无码人妻黑人中文字幕| 日韩最新中文字幕电影免费看| 日韩视频在线直播| 自慰无码一区二区三区| 国产欧美一区二区三区在线老狼| 91女人18毛片水多国产| 欧美高清视频免费观看| 午夜欧洲一区| 中文字幕 日韩 欧美| 亚洲一区在线视频| 免费国产在线视频| 成人信息集中地欧美| 日韩亚洲在线| 国产不卡在线观看视频| 精品国产乱码久久久久久夜甘婷婷| 深夜福利视频一区二区| 一区二区国产日产| 成人精品免费视频| 九九热最新视频| 久久99亚洲热视| 国产日产精品_国产精品毛片| 91蝌蚪视频在线| 欧美午夜影院在线视频| 成码无人av片在线观看网站| 鲁丝片一区二区三区| 极品销魂美女一区二区三区| 久久露脸国语精品国产91| 中文字幕在线亚洲| 噜噜噜天天躁狠狠躁夜夜精品| 亚洲综合色在线观看| 性做久久久久久久免费看| 在线中文资源天堂| 精品乱色一区二区中文字幕|