最 近接到一個任務是這樣的,一臺Solaris服務器上需要運行一個腳本,,每天統(tǒng)計MySQL數(shù)據(jù)庫中的數(shù)據(jù)并生成報表,。本來這是一個可以就事論事的小項 目,但是為了以后的靈活和可擴展性,,我設計了一個使用XML做統(tǒng)計模版配置的方案,。由于在Bash下不太好實現(xiàn)XML的訪問,因此我考慮用Perl來實現(xiàn) 這個腳本,。 Perl是一個強大的腳本語言,,本來是設計應用在文本處理方面的,但是后來發(fā)展的越來越強大,,已經(jīng)可以處理網(wǎng)絡、圖形,、系統(tǒng),、文件等等各個方面 的內容。Perl本身內置了豐富的操作符和函數(shù),,外部也有多年積累下來的大量模塊,。但是不知道什么原因在國內好像很少有人用。關于Perl的歷史我就不多 說了,有興趣可以上網(wǎng)查一下,。有一點要說的是,,目前Perl最新的版本是5.8.6,而Perl6雖然已經(jīng)設計很久了但是由于自舉問題目前還沒有一個可用 的版本,。為了解決這個問題,,臺灣的唐宗漢發(fā)起的Pugs項目正在快速的實施中,可能很快就能有結果了,,有興趣的朋友可以多多關注一下,,也許還可以為開源世 界做點貢獻。 雖然很早以前就了解過Perl,,但是從來就沒有實際的用它做過項目,,因此這次的實現(xiàn)是一個邊學邊做的過程。作為一個程序員,,學習一種新的語言總 會有一點慣性思維,,加之Perl在語法上與C語言比較類似。因此我想在這片文章中主要以C為背景做一個比較,。這種比較不是比較語言上的優(yōu)劣,,而是說明同樣 的功能如何在Perl中實現(xiàn)以及之間的區(qū)別。限于篇幅,,具體的技術實現(xiàn)的細節(jié)我就不在這里多說了,,你可以在末尾的資源一節(jié)中找到很多相關的文章。如果你沒 有接觸過Perl,,我想你可能更希望看到學習Perl的過程中可能會遇到的一些問題以及解決方法,。 工欲善其事,必先利其器 要寫代碼,,首先至少得有一個編輯器,。Perl是跨平臺的一種解釋型語言,可以在Unix/Linux/Windows/Mac等平臺上運行,。具 體對應平臺上的編輯器,,最簡單的方案是Unix下用vi,Windows下用UltraEdit,。當然也有商業(yè)化的IDE,,不過我嘗試了一下發(fā)現(xiàn)并不是那 么的好用,因此我在Windows平臺上以UltraEdit作為編輯環(huán)境,,完成后移植到Solaris平臺上,。 關于環(huán)境的搭建,有這樣幾個需要注意的地方: 1,、 Windows平臺下對應的是ActivePerl,,可以免費下載。 2、 去UE的網(wǎng)站上下載Perl的AutoComp文件,,可以實現(xiàn)自動完成功能,。 3、 下載Perl對應的語法加亮的Tag文件并加入到UE中,,可以更塊的發(fā)現(xiàn)拼寫錯誤,。 4、 在UE設置一個快捷工具,,命令行為C:\Perl\bin\perl.exe "%F"(捕獲輸出),,可以實現(xiàn)快速運行并顯示結果。 5,、 如果你不喜歡UE,,那么我推薦Source Insight
說起編程語言,簡單的來說無非就是這樣幾個必不可少的基本元素:變量,、數(shù)據(jù),、表達式、流程控制語句(包括條件,、分支,、循環(huán))、函數(shù),、對象,。具體到語言上,大部分的內容只是表達的形式不同而已,。而Perl與C又有什么區(qū)別呢,? 首先要知道,Perl是一種腳本語言,。所謂的腳本,,就是沒有主函數(shù),從最開始一行一行的按照順序解釋執(zhí)行(老版Basic不也是如此嗎),。因此,,盡管把你的思路轉化為流程用Perl表達出來吧。 其次,,Perl的設計中參考了很多語言的長處,,并避免了設計上的缺陷。因此Perl的很多語法你可能都會覺得似曾相識,。我把Perl的語法總結 了一下,,和C語言做了一個簡單的對比表格。表格左右兩邊的語句是C和Perl對應表達同一個功能各自的不同方式,。如果讀者有C語言的經(jīng)驗,相信看到這個對 比可以很快的上手吧?
use strict;
main();
sub main { … } 在這個框架下面,,你幾乎可以容易就開始你的Perl開發(fā)了,。如果需要處理命令行參數(shù),就可以稍微的擴展一下這個框架,。 use strict; use Getopt::Std; main();
{ my $VERSION = '1.0.0'; my $USAGE = "pp.pl [-v | -c configfile]\n"; my $opts={};
die $USAGE unless( getopts("c:v", $opts) ); die $VERSION if ($opts->{'v'}); $configfile=$opts->{'c'} ? $opts->{'c'} : 'config.xml' ; }
{ ProcessOptions(); print $configfile; … } 實際上,,剩余的工作和以往的工作差不多了,編寫一個一個的函數(shù),,并實現(xiàn)你的業(yè)務邏輯,。對于你這樣一個聰明的程序員來說,學會Perl是一個很容易的事情,。
1,、 程序的入口參數(shù)怎么?。?/p> 內置數(shù)組@ARGV包含了所有的運行參數(shù),??梢源蛴〕鰜砜纯?print @ARGV; 2、 函數(shù)如何傳參數(shù),、取參數(shù),? 每個函數(shù)內部都有一個內置的數(shù)組 @_ ,,這個數(shù)組的元素就是函數(shù)的參數(shù)。例如傳入的第一個參數(shù)就是$_[0],,第二個是$_[1],。唔,如你所見,,Perl的函數(shù)參數(shù)就是C中的動態(tài)參數(shù)。 3,、 默認變量是什么 這個可能會把你的頭搞暈,。有一個內置變量 $_ , 4,、 顯示消息,、退出常見的簡單寫法 也可以在條件不滿足的情況下使用 5、 格式化輸出 可以用簡單的print語句進行一般的輸出操作,,如果需要復雜的格式化輸出,,可以使用printf語句……跟C的用法幾乎是一樣的。 6,、 =>是什么東西? 在使用Hash表的時候,,可以經(jīng)常看到=>這個符號,。例如這樣的一個定義: 'Simon'=> '[email protected]', 'Jesse'=> '[email protected]' }; 其實,,=>符號跟逗號”,”是等價的。Perl里面的Hash表事實上是一個數(shù)組,,只是把奇數(shù)位元素看做是Key(鍵),,而把偶數(shù)位的元素看做是Value(值)。 7,、 關于引用的一點說明 Perl的引用類似C的指針,,所謂的引用事實上就是地址。取一個變量的地址用反斜杠”\”操作符,,例如 $p=\$x; 那么$p就是一個指向$x變量的指針,。要引用指針的值,使用”$”操作符,,例如 print $$p; 就是打印$x的值,。 引用不單單可以引用變量,也可以引用數(shù)組,、HASH表,、函數(shù),取函數(shù)的地址可以使用*操作符,。
還能做什么 編寫系統(tǒng)管理的腳本 和Apache結合起來,編寫CGI程序 編寫動態(tài)網(wǎng)頁 使用Net命名空間下的類編寫網(wǎng)絡應用程序 使用Authen::Captcha模塊實現(xiàn)提交時的驗證碼的功能 使用Storable模塊處理Perl的各種數(shù)據(jù)結構 使用GD/Image::MagicK模塊處理圖形 等等… |
|