上個(gè)禮拜,要求完成一個(gè)任務(wù),從下載特定網(wǎng)頁(yè)并從中抓取一些感興趣的字段.
做法很簡(jiǎn)單,用wget獲取網(wǎng)頁(yè)代碼,采用正則表達(dá)式抓取數(shù)據(jù).
剛開(kāi)始采用Shell,但是到了采用正則的時(shí)候出現(xiàn)了問(wèn)題,我承認(rèn)我的sed玩的不夠好,這個(gè)任務(wù)應(yīng)該可以用sed搞定的,但是整了半天都沒(méi)整好,有人又說(shuō)可以用grep,弄了半天都沒(méi)有完成.我開(kāi)始對(duì)使用shell中的小工具反感了起來(lái),雖然根據(jù)Unix的哲學(xué),一個(gè)工具完成一件事情,通過(guò)管道等膠合劑把它們連接在一起.但是,會(huì)出現(xiàn)以下的問(wèn)題:1)對(duì)我那個(gè)問(wèn)題而言,可能同時(shí)有多個(gè)工具可以完成任務(wù),而sed,awk之類的學(xué)習(xí)成本稍高 2)有一些問(wèn)題,shell中沒(méi)有很好的解決辦法,比如我將每個(gè)網(wǎng)站的地址和抓取數(shù)據(jù)所需的正則表達(dá)式存儲(chǔ)在了mysql數(shù)據(jù)庫(kù)中,shell中有工具可以訪問(wèn)數(shù)據(jù)讀取它們嗎?(如果你知道請(qǐng)告訴我) 3)并不是任何的任務(wù)shell中都可以找到工具完成,比如我想寫(xiě)一個(gè)測(cè)試我的服務(wù)器的測(cè)試客戶端,如果我不會(huì)腳本語(yǔ)言,那么很有可能又得從頭寫(xiě)一個(gè)C程序來(lái)完成這個(gè)工作.
也就是說(shuō),我需要一個(gè)工具,功能足夠的完備,可以操作文本文件,訪問(wèn)數(shù)據(jù)庫(kù),建立socket連接等等,同時(shí),對(duì)一些問(wèn)題的解決有統(tǒng)一的方案,比如我如果要在文本文件中查找我所需的字段不再要去考慮是采用grep,sed還是awk了.
滿足這些要求的腳本語(yǔ)言似乎只有Perl和Python了,去年學(xué)過(guò)一些Python,感覺(jué)語(yǔ)法簡(jiǎn)潔很容易入門,不過(guò)聽(tīng)說(shuō)速度不夠快,今年開(kāi)始轉(zhuǎn)向了Perl,Perl的語(yǔ)法非常的靈活,是我見(jiàn)到的最靈活的語(yǔ)言,這也許跟這門語(yǔ)言的發(fā)明人是個(gè)語(yǔ)言學(xué)家,倡導(dǎo)"There is more than one way to do it"有關(guān)吧.剛開(kāi)始很不習(xí)慣,畢竟我是C程序員出身,習(xí)慣了C的語(yǔ)言,現(xiàn)在慢慢的適應(yīng)了.
話歸正題,這里說(shuō)的放棄Shell指的是不在Shell編程上多花時(shí)間,但是基本的Shell命令和概念還是應(yīng)該有的,萬(wàn)變不離其宗,不懂shell的程序員不能算是優(yōu)秀的unix程序員,只不過(guò)我更加需要一個(gè)通用的工具去完成我大部分的工作罷了.