Perl語言的文書處理模式之三(轉)

post0發表於2007-08-10
Perl語言的文書處理模式之三(轉)[@more@]

  三、文書處理模式(Regular Expression)相關的運算子及函式

  在perl程式寫作中常會用到=~和!~這兩個運算子及s和tr這二個函式來和文書處理模式/pattern/搭配而成一個運算式,如果能夠活用這些指令的話,就可以很輕易地來處理一些字串,當然在CGI程式設計中也就更能得心應手了。現在就讓作者來介紹這些運算子及函式的用法:

  --------------------------------------------------------------------------

指令: /pattern/文字運算

說明:如果在文字運算中沒有使用=~或是!~運算子指定一個字串來做運算的話, 就會

使用內定的輸出變數$_來做/pattern/文字運算。

範例一:

  $string="chmod7llcgi";

  $string=~/(w+)s+(d+)/;

  第一個(w+)是代表找尋數個字母,並將所找到的字串指派給$l這個變數,而s+代

表 找尋多個空白的字串,最後(d+)代表找尋數個數值,並將所找到的字串指派給

$2這 個變數。所以$l="chmod",$2=71l,但是$string還是等於原來的字串,沒有改變。

範例二:

  $_="chmod71lcgi";

  /(w+)s+(d+)/;

  因為是把字串指定給$_這個變數,所以可以不用=~這個運算子就會得到

$l="chmod", $2=711;而且$_還是等於原來的字串,沒有改變。

範例三:

  $string="chmod71lcgi";

  @list=split(/s+/,$string);

  以一個或是多個空白字元來分割$string這個字串,這是一個很常用的語法。此時

  @list=("chmod","7ll","cgi");

指令: =~相配運算子

說明:這是Perl語言中特有的語法,通常會和文書處理模式來作運算。

範例:

  print"請輸入一個字串!n";

  $string=<>; #<>代表標準輸入,會讓使用者輸入一字串

  chop($string);  #將$string最後一個換行的字元n刪除掉

  if($string=~/cgi/){  

   print"輸入的字串中有cgi這個字串!n";

  }

  如果輸入的字串中含有cgi這個字串的話,就會顯示出這個資訊。

  --------------------------------------------------------------------------

指令:!~不相配運算子

說明:這也是Perl語言中特有的語法,通常會和文書處理模式來作運算。

範例:

  print"請輸入一個字串!n";

  $string=<>; #<>代表標準輸入,會讓使用者輸入一字串

  chop($string);  #將$stdng最後一個換行的字元n刪除掉

  if($string!~/cgi/){

    print"輸入的字串中沒有cgi這個字串!n";

  }

  如果輸入的字串中沒有含有cgi這個字串的話,就會顯示出這個資訊。

  --------------------------------------------------------------------------

指令:tr轉換函式

語法:tr/SEARCHLIST/REPLACELIST/

  其中SEARCHLIST是要轉換的字元,REPLACELIST是轉換成何種字元。

說明:tr(translate)就是轉換的意思,會把符合轉換的字元轉換成要轉換的字元。

範例一:

  $string="test1ng";

  $string=~tr/et/ET/;#此時$string="TEsTing";

  $string=~tr/a-z/A-Z/;#此時$string="TESTING";

範例二:

  $string="CGI+Perl";

  $string=~tr/+//;#此時$string="CGI Perl";

  在傳送CGI資料的時候會先將資料編碼,其中會將空白的字元轉成+這個字元,所以 在

解碼的時候要把+這個字元還原成空白的字元。

指令:s取代函式

語法:s/PATTERN/REPLACE/eg

  其中PATTERN是文書處理(Regular Expression)的模式,REPLACE是代表取代成何種文

字 模式。而g是這個函式最常用的引數,代表要把所有符合文字模式的字串 全部取

代,如果省略這個引數的話,則只取代一個符合文字模式的字串;而加上e這 個引數是代

表要將REPLACE的部分當成一個運算式,如果沒有這個需要的話,就不用加 上這個引數。

說明:將符合文書處理模式的字串取代成為要取代的字串。

範例一:

  $string="i;love;perl";

  $string=~s/:/*/:   #此時$string="i*love:perl";

  $string=~s/:/*/g;   #此時$string="i*love*perl";

  $stiing=~s/*/+/g;   #此時$string="i+love+perl";

  $string=~s/+//g:   #此時$string="i love perl";

  上一行也可寫成$string=~tr/+//;效果都會一樣哦!

  $string=~s/per1/cgi/; #此時$string="i love cgi";

範例二:

  $string="i love per";

  $string=~s/(love)//;

  第一個()內所找到的字串變成$1,在這個範例中,會把變數love這個字串變成

<>,此時$string="i<>perl";

  $string="i love per1";

  $string=~s/(i)(perl)//;

  在這個範例中,會把i變成<>,perl變成<>此時$string="<>love<>";

  $striag="i love per1";

  $string=~s/(w+)//g;

  (w+)代表找尋符合一個或是多個英文字元或是數值的字串,之後再將找到的字 符串設成$l。因為加上g這個引數,所以會找到字串中的這三個英文單字, 然後 再把這三個單字分別加上<>這個符號,此時$string="<><><>";

範例三:

  $string="ww22cgi44";

  $string=~s/(d+)/$1*2/e;

  (d+)代表要找尋$string中一個或是多個數值的字串,再將找到的字串設成

$1。加上引數e是代表要把$l*2當作是一個運算式,所以$string="www44cgi44";

  $string="www22cgi44";

  $string=~s/(d+)/$1*2/eg;

  加上引數e,所以會把$1*2當作是一個運算式來看, 加上引數g就會把全部符合數 值

的字串經過運算式運算之後再把它取代,所以$string="www44cgi88";

範例四:

  假設原本的字串是$value="三八!",經CGI資料編碼之後,這個字串就會變成

$value="%A4T%A4K%21"。以下是一個解碼的示範程式:

  $value="%A4T%A4K%2l";

  $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($l))/eg;

  在傳送CGI資料的時候會把資料編碼,其中會將特殊字元或是中文字元編碼成以% 開頭的連續兩個十六進位制數的字串,所以要用s這個函式來找尋這個以%開頭的 字串。為了要把找到的字串再做解碼的處理, 所以要在%這個符號之後加上 ()這個符號, 表示會把找到的字串記憶起來並指定給$1這個變數,而且要在() 中加上代表是連續兩個十六進位制數值的文書處理模式(Regular Expression),也 就是[a-fA-F0-9][a-fA-F0-9]。再用hex這個函式($1是代表符合的字串)把十 六進位制數值轉成十進位制的碼,之後再用pack這個函式(以C為引數,是代表 unsigned char value的意思)把這個十進位制碼還原成原來的字串。最後就會 把這個字串解碼成$value="三八!"。值得一提的是也可以把這個解碼的程式 寫成:

  $value=~s/%(..)/pack("C",hex($l))/eg;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-943043/,如需轉載,請註明出處,否則將追究法律責任。

相關文章