top
Loading...
常規表達式(2)
三 常規表達式(Regular Expresion)相關的運算符及函數

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


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

指令:/pattern/文字運算

說明: 如果在文字運算中沒有使用=~或是!~運算符指定一個字符串來做運算的話,就會使用內定的輸出變量$_來做/pattern/文字運算。

范例一:

$string="chmod711cgi";
$string=~/(W)s+(d+)/;

第一個(W+)是代表找尋數個字母,并將的找到的字符串指派給$1這個變量,而s+代表找尋多個空白的字符串,最后(d+)代表找尋個數值,并將所找到的字符串指派給$2這個變量。所以$1="chmod";$2=711;但是$string還是等于原來的字符串,沒有改變。

范例二:

$_="chmod711cgi";
/(W)s+(d+)/;

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

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

范例三:

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

以上一個或是多個空白字符來分割$string這個字符串,這是一個很常用的語法。此時@list=("chmod","711","cgi");


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

指令: =~相配運算符

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

范例:

print"請輸入一個字符串!n";
$string=; #代表標準輸入,會讓使用者輸入一字符串
chop($string); #將$string最后一個換行的字符n刪除掉
if($string=~/cgi/){

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

}

如果輸入的字符串含有cgi這個字符串的話,就會顯示出這個信息。


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

指令:!~不相配運算符

說明:這也是Perl語言中特有的語法,通常會和常規表達式來運算。

范例:

print"請輸入一個字符串!n";
$string=; #代表標準輸入,會讓使用者輸入一字符串
chop($string); #將$string最后一個換行的字符n刪除掉
if($string!~/cgi/)
{

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

}

如果輸入的字符串中沒有cgi這個字符串的話,就會顯示出這個信息。


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

指令:tr轉換函數

語法:tr/SEARCHLIST/REPLACELIST/

其中SEARCHLIST是要轉換的字符;REPLACELIST是轉換成何種字符。

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

范例一:

$string="testing";
$string=~tr/et/ET/"; #此時$string="TEsTing";
$string=~tr/a-z/A-Z/; #此時$stirng="TESTING";

范例二:

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

  在傳送CGI數據的時候會先將數據編碼,其中會將空白的字符轉成+這個字符。


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

指令:s 取代函數

語法:s/PATTERN/REPLACE/eg

  其中

PATTERN是文字處理(Regular Expresion)的模式;
REPLACE是代表取代成何種文字模式。
而g是這個函數最常用的參數,代表要把所有符合文字模式的字符串全部取代,如果省略這個參數的話,則只取代一個符合文字模式的字符串中;
而加上e這個參數代表要將REPLACE的部分當成一個運算式,如果沒有這個需要的話,就不用加上這個參數了。
說明:將符合常規表達式的字符串取成為要取代的字符串

范例一:

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

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

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

范例二:

$string=~s/(love)/<$1>/;

第一個()內所找到的字符串變成$1,在這個范例中,會把變量love這個字符串變成,此時$string="iperl";

$string="i love perl";
$string=~s(i)(perl)/<$1><$2>/;

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

$string="i love perl";
$string=~s(W+)/<$1>/g;

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

范例三:

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

(/d+)代表要找尋$string中一個或是多個數值的字符串,再將找到的字符串設成$1。加上參數e是代表要把$1*2當作是一個運算式,所以$string="www22cgi44";

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

加上參數e,所以會把$1*2當作是一個運算符式來看;加上參數g就會把全部符合數值的字符串經過運算式運算之后再把它取代,所以$string="www44cgi88";

范例四:

假設原本的字符串是$value="三八!",經CGI數據編碼之后,這個字符串就會變成

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

$value="%A4T%A4K%21";
$vlaue=~s/%([a-fA-F0-9][a-fA-F0-9]/pack("c",hex($1))/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($1))/eg;

在此提供給讀者參考。 
北斗有巢氏 有巢氏北斗