- 論壇徽章:
- 0
|
Unix/Linux 平臺任務(wù)的自動化(二)
11.3 Perl
Perl
是從awk發(fā)展起來的,它由Larry Wall在1986年發(fā)明。它是一種功能強(qiáng)大的編程語言,而且可以在許多平臺上使用。實際上,你完全可以將
Perl作為一種標(biāo)準(zhǔn)編程語言( 不是腳本語言)來使用,筆者非常喜歡它,并且建議所有不想學(xué)習(xí)C語言的UNIX管理員應(yīng)該掌握Perl的基本編程技術(shù)。
目前,常用的版本是perl 5,幾乎所有的Linux發(fā)行版本都會包含它,缺省時,linux的perl 5安裝在/usr/bin下,命令是/usr
/bin/perl.
11.3.1 基本語法
perl的語法介于C和basic之間,一個perl程序由若干行組成,使用的時候由perl解釋程序解釋執(zhí)行。每個完整的行都應(yīng)該用分號結(jié)尾。
Perl的基本語法是這樣的:
① 變量和運(yùn)算符
在perl中,所有變量都不需要提前聲明。一旦對某個變量賦值,就自動產(chǎn)生了這個變量。perl的變量有普通變量,數(shù)組和關(guān)聯(lián)數(shù)組三種。普通變量就是數(shù)值和字符串,要聲明一個普通變量,在變量名字前面加上$,例如
$string1="aaa";
$test=5;
$u=1.33;
同樣,訪問變量內(nèi)容也需要使用$符號。
數(shù)組用@字符標(biāo)志,如
@name1=("tom","marry","john");
$b=$name[0]; $b現(xiàn)在等于"tom"
$b=@name[0];跟上一句是一樣的
$name[0,2]=["help","so"];現(xiàn)在@name等于[“help","marry","so"]
@name[0,2]==@name[2,0];交換0,2元素
數(shù)組的大小不是固定的,你可以動態(tài)地添加數(shù)組元素,例如
$name[3]="app";增加一個元素
直接訪問數(shù)組名字將得到數(shù)組中元素的個數(shù),例如:
$count=@name;將name的元素個數(shù)存放到$count變量中。
關(guān)聯(lián)數(shù)組是一種特殊的數(shù)組,每個元素都由一對元素構(gòu)成;蛘哒f,關(guān)聯(lián)數(shù)組是一種下標(biāo)不是整數(shù)的數(shù)組,要聲明一個關(guān)聯(lián)數(shù)組,使用%符號,例如:
%arr=(1,"one",2,"two",3,"three",4,"four");
這時可以用前面的值(key)來索引后面的值:
$one=$arr{1};這時$one等于"one"
注意關(guān)聯(lián)數(shù)組的訪問方式,是使用$關(guān)聯(lián)數(shù)組名字[索引號]。
你可以把關(guān)聯(lián)數(shù)組看成數(shù)據(jù)庫的一種實現(xiàn)。與一般的數(shù)組一樣,其大小也可以動態(tài)調(diào)節(jié):
$arr{5}="five";增加一對數(shù)據(jù)。
可以將關(guān)聯(lián)數(shù)組簡單地變成普通數(shù)組,例如
@X=%arr;現(xiàn)在@X的內(nèi)容是X[0]="1",X[1]="one",……………
perl的運(yùn)算符與C語言以及我們介紹的gawk很相似,包括普通的+-*/%以及來自C語言的邏輯運(yùn)算符&&(和),||(或),等等,下面是一個列表:
+ - * / 四則運(yùn)算,注意perl的除法是浮點除法
$a % $b a對b取余數(shù),例如3%2的結(jié)果是1
$1 .. $2 區(qū)段運(yùn)算符,這個算符取出$1和$2中間的所有值,例如1..9返回一個表
1,2,………9。通常用這個命令初始化一個數(shù)組,例如:@dec=1..9;@oth=(1..26,'A'..'Z')等等。
= 賦值算符
> = $filename")。想要在某個文件的后面追加內(nèi)容,使用
open(Filehandle,">>$filename")。當(dāng)然,open(Filehandle,";從句柄FILE指向的文件中讀取一行,內(nèi)容存入$filecontent變量。如果你要從控制臺讀取一個字符串,使用$input=;就可以了。
下面是一個例子:
$filename="test";
open (FILE,"$filename")||die "can not open file!;
while($line={
print "$line";
}
close(FILE);
這
個程序?qū)嶋H就是cat命令的perl語言實現(xiàn),open命令打開當(dāng)前目錄下面的test文件,并且把句柄返回到FILE變量,注意這一行的用法,Perl
的||(或)運(yùn)算是短路求值的,如果open成功,那么返回一個非0的數(shù),因此這算式無論如何都會為真,所以會跳過||后面的東西;否則,如果open失
敗,perl就要對后面的東西執(zhí)行一下,于是退出這個程序。
打開成功之后,perl會得到這個文件的句柄,下面的句子就是反復(fù)讀取文件的每一行并且顯示出來,當(dāng)文件讀到末尾的時候,$line=將產(chǎn)生一個空字符串,于是while循環(huán)結(jié)束。
與shell腳本語言類似,perl還有一些文件測試運(yùn)算符
-t $file
如果$file這個文件可讀,返回1,$file是文件名。
-w $file
如果$file可寫,返回1
-x $file
如果$file可以執(zhí)行,返回1
-e $file
如果$file存在,返回1
-o $file
如果用戶是$file的擁有者,返回1
-s $file
返回$file文件的大小
-f $file
是否為正常文件
-T $file
是否文本
-B $file
是否二進(jìn)制文件
-M $file
文件從更新到現(xiàn)在的日期數(shù)
④流程控制
perl支持與C語言很相似的流程控制語句:
if和if..else:
if語句的語法是
if(...){
clause;
}
與C語言不同,即使只有一行程序,if后面的花括號也不能省略,這一點也適用于后面說的其他復(fù)合語句。
與C語言類似,也可以用else和elseif子句:
if(...){
clause1;}
else {
clause2;
}
或者
if (…){
...
}
elseif(…){
....
}
else{
...
}
另外,perl還支持unless語句:
unless(exp1){
clause1;
}
如果exp1不成立,就執(zhí)行clause1子句。這個unless語句里面也可以使用else子句。實際上,這就是一種否定形式的if……else語句。
while循環(huán)語句:
while的語法有兩種,分別是將表達(dá)式放在循環(huán)首部和尾部,第一種形式是:
while(exp){
clause;
}
第二種形式是
do {
clause;
}
while(exp);
都是循環(huán)執(zhí)行clause直到exp不成立,不過一個在循環(huán)頭部判斷exp表達(dá)式是否為真,另一個是在循環(huán)尾部。
until循環(huán)
語法是until(exp){
clause;
}
反復(fù)執(zhí)行clause直到exp成立。
for循環(huán)
for(初始化;繼續(xù)條件;增量){
循環(huán)體;
}
這個for循環(huán)和C的一樣,首先執(zhí)行初始化語句,然后開始循環(huán)執(zhí)行循環(huán)體,每次循環(huán)都調(diào)用一次增量表達(dá)式,直到循環(huán)繼續(xù)條件不再成立。例如
for ($1=0;$i/;
這時,s首先搜索滿足\d+(數(shù)字)的串,得到24,然后送入$1,接著再套上,結(jié)果是 "test".
⑥內(nèi)置變量
除了用戶定義的變量之外,perl還定義了一些內(nèi)置變量,它們在perl中有特殊的意義,用戶不能修改它們的含義(有些可以賦值),下面是常用的內(nèi)置變量:
@ARGV
這
是個數(shù)組,它代表的是傳遞給perl程序的命令行開關(guān),如@ARGV[0]是第一個參數(shù),@ARGV[1]是第二個等等。如果你的perl程序名字叫
test,而你用test me other去調(diào)用它,那么@ARGV[0]是”me”,@ARGV[1]是other,以此類推。
$_和$1,$2,………
這幾個參數(shù)用于文本處理模式中的臨時變量。舉個例子來說,串匹配模式中:
$string="chmod711cgi"
$string=~/(\w+)\s+(\d+)/;
看
上去這第二行代碼什么也不做,因為它僅僅是個匹配語句。不過,實際上,由于perl會把臨時變量放進(jìn)$n變量,所以它會修改$_和$1,………變量。在這
個匹配模式中,首先的\w+匹配一組字符,成功,得到chmod字符串,于是perl將它保存到$1;然后,\s+匹配一組空白符號,失;最后,\d+
匹配一組數(shù)字,成功,得到711,perl將它保存到$2。
如果在匹配模式中沒有指明對那個串變量使用匹配模式,就使用$_進(jìn)行匹配。
⑦自定義函數(shù)
Perl程序中允許定義自己的子程序。例如,下面的語句定義了一個子過程:
sub my_proc {
print “this is my subrouting\n”;
}
sub是子過程的說明,my_proc是過程名字,要調(diào)用這個過程,只要使用&符號,例如:
if($want==1){
&my_proc;
}
11.3.2 perl的使用
上
面介紹了perl的基本語法。要使用perl,你當(dāng)然可以在交互模式下使用,但是,一般情況下,我們用perl是代替shell腳本完成自動化任務(wù)的。為
此,我們需要把perl寫成程序來運(yùn)行。寫perl程序可以用任何文本編輯工具創(chuàng)建,一般總是設(shè)置其擴(kuò)展名為.pl,雖然實際上擴(kuò)展名是不需要的。
要運(yùn)行一個perl程序,有兩種方法,一種是調(diào)用perl解釋器讀入perl源程序,例如,我們已經(jīng)寫了一個perl程序,命名為test.pl,那么,可以用下面的命令執(zhí)行它:
$ /usr/bin/perl test.pl
不過,在一般情況下,我們更喜歡在命令行下面直接敲入程序的名字執(zhí)行它,為此,可以在perl程序的頭部加入這樣的行:
#!/usr/bin/perl
注
意#!符號,它告訴shell應(yīng)該用什么程序來解釋當(dāng)前腳本,這里的定義是/usr/bin/perl,這是缺省的的perl安裝位置。如果你的perl
可執(zhí)行程序放在別的目錄下,自己修改這一行。這樣,當(dāng)shell讀到這個文件的時候,就會自動啟動perl來解釋這個程序。
perl最常用的功能是用來寫cgi程序,不過,我們不想涉及cgi程序的細(xì)節(jié)。相反,我們介紹如何用perl進(jìn)行日常管理,用perl程序代替書寫晦澀的shell腳本。
讓
我們從一個我自己的例子開始,我經(jīng)常要把一些txt文本直接轉(zhuǎn)化成html文本,以便做進(jìn)一步的編輯和主頁發(fā)布,其實這個操作非常簡單,就是將回車和大于
號,小于號都換成對應(yīng)的HTML標(biāo)記,這可以用word或者netscape來完成,但是如果涉及的文件數(shù)目比較多或者文件比較大,用這些軟件就很困難
了,所以我寫了一個十分簡單的perl腳本:
#!/usr/bin/perl
if((@ARGV[0] eq "")||(@ARGV[1] eq "")) {
print "convert inputfile outputfile\n";
exit;}
open (FILE1,"@ARGV[0]")||die"can not open source file!\n";
open (FILE2,">@ARGV[1]")||die "can not open taget file!\n";
while($line=){
$line=~s//>/g;
$line=~s/\^M//g;
$line=~s/\n/
/g;
print FILE2 $line;
}
close (FILE1);
close (FILE2);
這個程序簡單得幾乎象是DOS的批命令,首先檢查參數(shù)是否定義,然后從輸入文件中讀取行,把回車和兩個尖括號換成對應(yīng)的html標(biāo)記,寫入對應(yīng)文件,任務(wù)就完成了。要使用它,比如把test.txt轉(zhuǎn)換成test.html,可以直接執(zhí)行:
./convert.pl test.txt test.html
perl也可以完成更復(fù)雜的操作,最常見的功能擴(kuò)展是進(jìn)行網(wǎng)絡(luò)編程,如直接使用電子郵件,電子新聞服務(wù)等等。不過我們這里不能進(jìn)一步介紹它的強(qiáng)大功能。對perl感興趣的朋友,可以進(jìn)一步查閱有關(guān)書籍學(xué)習(xí)編程技術(shù)。
11.4 其他工具
還有很多自動化腳本工具,例如python等等。另外,對于一個職業(yè)的系統(tǒng)管理人員,熟悉C語言的編程是很有好處的。
就
我個人而言,我感到,如果你不想學(xué)習(xí)shell,那么了解expect和perl就足以對付一般的系統(tǒng)管理工作。另外,還有一些威力強(qiáng)大的可編程工具,一
個是我們剛才提到的python,這是一種面向?qū)ο蟮哪_本平臺,如果你的大部分任務(wù)使用shell和expect,那么這個東西可能很適合你使用。
另
外一個非常有爭議的產(chǎn)品是emacs。這個編輯工具是GNU計劃的頭號產(chǎn)物,隨著發(fā)展,它已經(jīng)從原來一個文本編輯程序發(fā)展成為一個使用lisp宏控制,幾
乎可以做文本界面下的一切事情的集成環(huán)境。反對它的理由主要是它的運(yùn)行速度在低配置的機(jī)器上幾乎無法忍受,而且配置起來也十分困難。不論如何,使用
emacs有時顯得比較有專業(yè)特色,至少是很有GNU的特色。
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/70515/showart_1161118.html |
|