精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

中文字幕91视频| 天天做天天干天天操| 天天综合天天色| 免费日本视频一区| 欧美贵妇videos办公室| 国产一区二区三区奇米久涩| 国产 日韩 欧美 在线| 国产中文精品久高清在线不| 亚洲国产精品欧美一二99| 精品免费视频123区| 做爰视频毛片视频| 尤物精品在线| 最近2019中文字幕大全第二页 | 蜜臀av在线播放一区二区三区| 久久伊人免费视频| 蜜桃无码一区二区三区| 日韩在线观看中文字幕| 色噜噜偷拍精品综合在线| 成人国产在线看| 在线播放麻豆| 91在线一区二区三区| 成人午夜高潮视频| 中文字幕第四页| 一区在线免费| 久久亚洲精品网站| 五月婷婷欧美激情| 亚洲三级精品| 欧美精品一区二区蜜臀亚洲| 57pao国产成永久免费视频| 自拍在线观看| 性久久久久久久久久久久| 日韩国产精品毛片| 亚洲1卡2卡3卡4卡乱码精品| 久久久精品天堂| 精品久久久久久一区二区里番| 99精品国产99久久久久久97| 久久精品国产精品亚洲精品| 国产精品黄页免费高清在线观看| 国产又大又黑又粗免费视频| 激情综合久久| 久久久久久久久久国产精品| 黄色一级片在线| 亚洲精品成人无限看| 日韩专区在线播放| 久久视频一区二区三区| 国产九一精品| 亚洲天堂av女优| 泷泽萝拉在线播放| 网友自拍一区| 亚洲欧美国产日韩天堂区| 免费在线观看成年人视频| 林ゆな中文字幕一区二区| 337p日本欧洲亚洲大胆色噜噜| 久久久久久久人妻无码中文字幕爆| 日韩精品视频在线看| 欧美一级片在线观看| 久久久久久国产精品日本| 天堂va在线高清一区| 日韩一区二区在线观看| 成年人看片网站| japanese色系久久精品| 亚洲第一天堂av| wwwwww日本| 欧美在线电影| yw.139尤物在线精品视频| 日韩国产第一页| 欧美破处大片在线视频| 久久久久久91| 久久久久99精品成人片我成大片| 久久婷婷丁香| 国产精品一区久久久| 国产乱码久久久| 丁香六月综合激情| 免费日韩av电影| aaa在线观看| 亚洲精品日日夜夜| 成人免费播放器| 欧美7777| 666欧美在线视频| 亚洲av成人片无码| 国产成人三级| 欧美成人剧情片在线观看| 久久免费视频播放| 老司机亚洲精品| 亚洲综合成人婷婷小说| 欧美婷婷久久五月精品三区| 国产精品久久久久久亚洲伦| 欧洲精品在线播放| 一二区成人影院电影网| 日韩午夜在线观看| 在线观看国产精品一区| 中文字幕一区二区三区在线视频| 97在线日本国产| 97人妻人人澡人人爽人人精品| 不卡的av网站| 中国成人在线视频| 性欧美18~19sex高清播放| 欧美日韩大陆一区二区| 欧美xxxx×黑人性爽| 日韩精品1区| 97视频在线观看免费高清完整版在线观看 | 亚洲第一福利专区| 久久香蕉国产线看观看av| 日韩黄色一级大片| 国产综合久久久久影院| 免费久久久一本精品久久区| 日韩精品亚洲人成在线观看| 在线观看国产一区二区| 日韩综合第一页| 91精品在线观看国产| 日本成人在线视频网址| 午夜精品久久久久久久99| 国产人成一区二区三区影院| 缅甸午夜性猛交xxxx| 亚洲国产天堂| 国产亚洲一级高清| 久久夜色精品国产噜噜亚洲av| 国产精品一区二区三区乱码| 日韩性感在线| 亚洲福利影院| 亚洲黄色片网站| 精品欧美一区二区久久久久| 六月丁香婷婷久久| 茄子视频成人在线观看| 国产一二在线播放| 欧美一卡在线观看| 亚洲波多野结衣| 久热成人在线视频| 色一情一区二区三区四区| 日本不卡1234视频| 亚洲第一黄色网| 免费人成视频在线| 黄色日韩网站视频| 一区二区在线观| 免费成人高清在线视频| 亚洲美女av电影| 中国一级免费毛片| 不卡一二三区首页| 一二三四视频社区在线| 91精品导航| 久久久久中文字幕| 蜜臀av午夜精品| 亚洲成人中文在线| 波多野结衣一二三区| 欧美日本一区| 国产66精品久久久久999小说| 丝袜在线视频| 日韩午夜三级在线| 久久香蕉精品视频| 成人精品亚洲人成在线| 97干在线视频| 欧美成a人免费观看久久| 国模视频一区二区三区| 天堂av在线免费| 欧美日韩国产精品一区二区不卡中文 | 国产亚洲美女久久| 中日精品一色哟哟| 中文字幕一区二区三区不卡在线| 国产福利精品一区二区三区| 亚洲影视一区| 成人看片在线| 成人午夜视屏| 中文字幕国产亚洲2019| 国产精品毛片久久久久久久av| 亚洲人被黑人高潮完整版| 人妻体体内射精一区二区| 激情另类综合| 深夜福利成人| 美女日韩一区| 97国产一区二区精品久久呦| 国产综合在线观看| 91精品国产一区二区三区香蕉| 久热精品在线观看| 91偷拍与自偷拍精品| 青青在线免费观看视频| 五月天久久久| 国产一区二区高清不卡| 99久久伊人| 久99久在线视频| 蜜桃免费在线| 在线播放欧美女士性生活| 久久精品国产亚洲AV无码麻豆| 97精品国产露脸对白| 五月婷婷丁香色| 国内精品美女在线观看| 欧美一区二视频在线免费观看| 国产精品99| 久久久久久com| avtt亚洲| 日韩精品中文字幕久久臀| 亚洲一区二区人妻| 精品久久久久久亚洲国产300| 很污很黄的网站| 91在线精品秘密一区二区| 九九热免费在线观看| 亚洲精选一区| 中国老女人av| 国产精品一区二区99| 亚洲最大福利视频网| 巨茎人妖videos另类| 欧美成人中文字幕| 97最新国自产拍视频在线完整在线看| 精品国产污网站| 在线观看黄色国产| 日韩欧美在线第一页| 青娱乐免费在线视频| 国产女人18水真多18精品一级做| 免费啪视频在线观看| 蜜桃久久久久久久| av动漫在线看| 亚洲午夜91| 裸体裸乳免费看| 欧美岛国激情| 日韩精品不卡| 亚洲精品一级二级三级| 成人免费视频观看视频| 国模大尺度视频一区二区| 国产精品91在线观看| 亚洲a视频在线观看| 色天天综合色天天久久| 久久精品国产亚洲AV无码男同| 综合久久综合久久| 免费福利视频网站| 久久免费视频一区| 少妇被狂c下部羞羞漫画| 国产丶欧美丶日本不卡视频| 日日干夜夜操s8| 日本强好片久久久久久aaa| 免费高清在线观看免费| 亚洲承认在线| 国产av熟女一区二区三区| 图片小说视频色综合| 亚洲视频精品一区| 人人狠狠综合久久亚洲婷婷| 日韩和欧美的一区二区| 少妇高潮一区二区三区| 国新精品乱码一区二区三区18| 午夜久久av| 亚洲精品免费网站| 欧美高清一级片| 91亚洲国产精品| 欧美影院精品| 成人免费视频观看视频| 国产精品超碰| 国产欧美在线一区二区| 精品在线网站观看| 极品日韩久久| 亚洲免费观看高清完整版在线观| 欧美成人综合一区| 深爱激情综合网| 午夜精品一区二区在线观看的| 成人在线一区| 中文字幕中文字幕在线中一区高清 | 久久伊人91精品综合网站| xvideos国产在线视频| 欧美精品在线看| 伦理av在线| 97超碰国产精品女人人人爽| 在线免费av资源| 国产精品福利无圣光在线一区| 日韩黄色三级在线观看| 91午夜在线播放| 9999久久久久| 欧美福利一区二区三区| 成人a'v在线播放| 咪咪色在线视频| 亚洲经典在线| 精品www久久久久奶水| 老汉av免费一区二区三区| 交换做爰国语对白| 91在线小视频| 极品色av影院| 亚洲韩国一区二区三区| 国产一级18片视频| 欧美日韩一区二区欧美激情| a在线观看免费| 日韩精品极品毛片系列视频| 成人激情电影在线看| 久久的精品视频| 蜜桃视频在线观看播放| 国产精品免费久久久| 一区二区在线视频观看| 欧美一区二视频在线免费观看| 亚洲成人一区| 成人免费观看视频在线观看| 韩国成人精品a∨在线观看| 亚洲精品国产成人av在线| 久久精品在线观看| 毛片aaaaa| 欧美日韩视频一区二区| 免费国产精品视频| 中文字幕国产亚洲2019| av手机在线观看| 国产久一一精品| 性欧美xxxx免费岛国不卡电影| 正在播放一区| 老司机一区二区三区| 国产xxxxhd| 国产精品毛片无遮挡高清| 日韩福利片在线观看| 在线电影一区二区三区| 欧美一区二区视频| 欧美精品激情在线观看| 日本久久二区| 欧美一区二区三区电影在线观看| 欧美日韩国内| 欧美性受xxxxxx黑人xyx性爽| 久久人人超碰精品| 国产在线一二区| 欧美一级二级在线观看| 成人在线观看黄色| 91大神在线播放精品| 日韩有吗在线观看| 一区二区三区av| 日韩精彩视频在线观看| 你懂的在线观看网站| 亚洲精品成人在线| 一区二区久久精品66国产精品| 亚洲精品网站在线播放gif| 色屁屁www国产馆在线观看| 成人免费看黄网站| re久久精品视频| 日韩av一二三四| 91在线高清观看| 日本在线小视频| 欧美成人午夜电影| av片在线观看永久免费| 91精品免费视频| 国产精品久久久久久影院8一贰佰| 日韩欧美在线免费观看视频| 99久久精品免费看国产| 国产精品30p| 亚洲精品一线二线三线无人区| а√天堂8资源在线官网| 91性高湖久久久久久久久_久久99| 日韩中文字幕高清在线观看| 日韩av片网站| 中文字幕av一区 二区| 成人免费一级片| 伊人久久久久久久久久| 亚洲成人av观看| 水蜜桃亚洲一二三四在线| 蜜桃av一区二区在线观看| 国产极品视频在线观看| 欧美日韩成人在线| 成人a在线视频免费观看| 91免费高清视频| 中文字幕亚洲精品乱码| 苍井空张开腿实干12次| 亚洲一二三区不卡| 手机在线精品视频| 538国产精品一区二区免费视频| 色橹橹欧美在线观看视频高清| 男女av免费观看| 国产日韩欧美麻豆| 国产尤物视频在线观看| 欧美久久久精品| 国产福利一区二区精品秒拍| 欧美亚洲国产成人| 国产视频在线观看一区二区三区| 亚洲一级av毛片| 欧美丰满少妇xxxxx| 美国十次av导航亚洲入口| a级黄色一级片| 国产午夜精品在线观看| 亚洲在线精品视频| 色综合色综合网色综合| 欧美综合精品| 91精品无人成人www| 一区二区三区不卡在线观看| 天天综合网天天综合| 国产精品高潮呻吟久久av野狼 | 日韩中文字幕视频在线观看| 国产精品欧美一区二区三区不卡| 男人添女人荫蒂免费视频| 久久亚洲综合av| 97人妻人人澡人人爽人人精品 | 天海翼一区二区| 亚洲人成在线观看| 亚洲一区二区小说| 欧美不卡在线播放| 中文字幕巨乱亚洲| 亚洲国产日韩在线观看| 日本精品久久久久久久| 99久久婷婷这里只有精品| 扒开伸进免费视频| 欧美在线观看一区二区| 日本h片在线观看| 日韩av电影免费观看| 国产福利91精品一区二区三区| 日韩久久中文字幕| 久久精品国产电影| 在线亚洲a色| 人妻av一区二区三区| 欧美伊人久久久久久午夜久久久久| 在线看女人毛片| 日韩av电影免费在线| 成人免费视频视频在线观看免费 | 婷婷综合六月| 妺妺窝人体色777777|