亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1001 | 回復(fù): 0
打印 上一主題 下一主題

Unix/Linux 平臺任務(wù)的自動化(二) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-09-01 12:51 |只看該作者 |倒序瀏覽
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//&gt/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
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP