Perl文字處理模式(regularexpresion)相關(guān)的運(yùn)算符及函數(shù)
本文和大家重點(diǎn)討論一下Perl文字處理模式(regularexpresion)相關(guān)的運(yùn)算符及函數(shù),在Perl程序?qū)懽髦谐?huì)用到=~和!~這兩個(gè)運(yùn)算符及s和t這二個(gè)函數(shù)來和文字處理模式/pattern/搭配,至于如何搭配請(qǐng)看本文詳細(xì)介紹。
Perl文字處理模式(regularexpresion)相關(guān)的運(yùn)算符及函數(shù)
在Perl程序?qū)懽髦谐?huì)用到=~和!~這兩個(gè)運(yùn)算符及s和t這二個(gè)函數(shù)來和文字處理模式/pattern/搭配,而成一個(gè)運(yùn)算式,如果能夠活用這些Perl指令的話,就可以很輕易地來處理一些字符串,當(dāng)然在cgi程序設(shè)計(jì)中了就更能得心應(yīng)手了。現(xiàn)在就讓作者來介紹這些運(yùn)算符及函數(shù)的用法:
--------------------------------------------------------------------------------
Perl指令:/pattern/文字運(yùn)算
說明:如果在文字運(yùn)算中沒有使用=~或是!~運(yùn)算符指定一個(gè)字符串來做運(yùn)算的話,就會(huì)使用內(nèi)定的輸出變量$_來做/pattern/文字運(yùn)算。
范例一:
$string="chmod711cgi";
$string=~/(\w)\s+(\d+)/;
第一個(gè)(\w+)是********數(shù)個(gè)字母,并將的找到的字符串指派給$1這個(gè)變量,而\s+********多個(gè)空白的字符串,最后(\d+)********個(gè)數(shù)值,并將所找到的字符串指派給$2這個(gè)變量。所以$1="chmod";$2=711;但是$string還是等于原來的字符串,沒有改變。
范例二:
$_="chmod711cgi";
/(\w)\s+(\d+)/;
因?yàn)槭前炎址付ńo$_這個(gè)變量,所以可以不用=~這個(gè)運(yùn)算符就會(huì)得到
$1="chmod";$2=711;而且$_還是等于原來的字符串,沒有改變。
范例三:
$string="chmod711cgi";
@list=split(/s+/,$string);
以上一個(gè)或是多個(gè)空白字符來分割$string這個(gè)字符串,這是一個(gè)很常用的語法。此時(shí)@list=("chmod","711","cgi");
--------------------------------------------------------------------------------
Perl指令:=~相配運(yùn)算符
說明:這是Perl語言中特有的語法,通常會(huì)和文字處理來作運(yùn)算。
范例:
print"請(qǐng)輸入一個(gè)字符串!\n";
$string=<stdin>#<stidn>********輸入,會(huì)讓使用者輸入一字符串
chop($string);#將$string最后一個(gè)換行的字符\n刪除掉
if($string=~/cgi/){
print("輸入的字符串中有cgi這個(gè)字符串!\n";
}
如果輸入的字符串含有cgi這個(gè)字符串的話,就會(huì)顯示出這個(gè)信息。
--------------------------------------------------------------------------------
Perl指令:!~不相配運(yùn)算符
說明:這也是Perl語言中特有的語法,通常會(huì)和文字處理模式來運(yùn)算。
范例:
print"請(qǐng)輸入一個(gè)字符串!\n";
$string=<stdin>#<stidn>********輸入,會(huì)讓使用者輸入一字符串
chop($string);#將$string最后一個(gè)換行的字符\n刪除掉
if($string!~/cgi/)
{
print("輸入的字符串中有cgi這個(gè)字符串!\n";
}
如果輸入的字符串中沒有cgi這個(gè)字符串的話,就會(huì)顯示出這個(gè)信息。#p#
--------------------------------------------------------------------------------
Perl指令:tr轉(zhuǎn)換函數(shù)
語法:tr/searchlist/replacelist/
其中searchlist是要轉(zhuǎn)換的字符;replacelist是轉(zhuǎn)換成何種字符。
說明:tr(translate)就是轉(zhuǎn)換的意思,會(huì)把符合轉(zhuǎn)換的字符轉(zhuǎn)換成要轉(zhuǎn)換的字符。
范例一:
$string="testing";
$string=~tr/et/et/";#此時(shí)$string="testing";
$string=~tr/a-z/a-z/;#此時(shí)$stirng="testing";
范例二:
$string="cgi+Perl";
$string=~tr/+//;#此時(shí)$string="cgiPerl";
在傳送cgi數(shù)據(jù)的時(shí)候會(huì)先將數(shù)據(jù)編碼,其中會(huì)將空白的字符轉(zhuǎn)成+這個(gè)字符。
--------------------------------------------------------------------------------
Perl指令:s取代函數(shù)
語法:s/pattern/replace/eg
其中pattern是文字處理(regularexpresion)的模式;
replace是代表取代成何種文字模式。
而g是這個(gè)函數(shù)最常用的參數(shù),********所有符合文字模式的字符串全部取代,如果省略這個(gè)參數(shù)的話,則只取代一個(gè)符合文字模式的字符串中;
而加上e這個(gè)參數(shù)代表要將replace的部分當(dāng)成一個(gè)運(yùn)算式,如果沒有這個(gè)需要的話,就不用加上這個(gè)參數(shù)了。
說明:將符合文字處理模式的字符串取成為要取代的字符串
Perl范例一:
$string="i:love:Perl";
$string=~s/:/*/;#此時(shí)$string="i*love:Perl";
$string=~s/:/*/g;#此時(shí)$string="i*love*Perl";
$string=~s/*/+/g;#此時(shí)$string="i+love+Perl";
$string=~s/+//g;#此時(shí)$string="ilovePerl";
上一行也可寫成$string=~tr/+//;效果都會(huì)一樣哦!
$string=~s/Perl/cgi;#此時(shí)$string="ilovecgi";
Perl范例二:
$string=~s/(love)/<$1>/;
第一個(gè)()內(nèi)所找到的字符串變成$1,在這個(gè)范例中,會(huì)把變量love這個(gè)字符串變成<love>,此時(shí)$string="i<love>Perl";
$string="ilovePerl";
$string=~s(i)(Perl)/<$1><$2>/;
在這個(gè)范例中,會(huì)把i變成<i>Perl變成<Perl>,此時(shí)$string="<Perl>love<i>";
$string="ilovePerl";
$string=~s(\w+)/<$1>/g;
(/w+)********符合一個(gè)或是多個(gè)英文字符或是數(shù)值的字符串,之后再將找到的字符串設(shè)成$1。因?yàn)榧由蟝這個(gè)參數(shù),所以會(huì)找到字符串的這三個(gè)英文單字,然后再把這三個(gè)單字分加上<>這個(gè)符號(hào),此時(shí)$string="<Perl><love><i>";
Perl范例三:
$string="www22cgi44";
$string=~s/(\d+)/$1*2/e;
(/d+)********尋$string中一個(gè)或是多個(gè)數(shù)值的字符串,再將找到的字符串設(shè)成$1。加上參數(shù)e是代表要把$1*2當(dāng)作是一個(gè)運(yùn)算式,所以$string="www22cgi44";
$string="www22cgi44";
$string=~s/(\d+)/$1*2/eg;
加上參數(shù)e,所以會(huì)把$1*2當(dāng)作是一個(gè)運(yùn)算符式來看;加上參數(shù)g就會(huì)把全部符合數(shù)值的字符串經(jīng)過運(yùn)算式運(yùn)算之后再把它取代,所以$string="www44cgi88";
Perl范例四:
假設(shè)原本的字符串是$value="三八!",經(jīng)cgi數(shù)據(jù)編碼之后,這個(gè)字符串就會(huì)變成
$value="%a4t%a4k%21"。以下是一個(gè)解碼的示范程序:
$value="%a4t%a4k%21";
$vlaue=~s/%([a-fa-f0-9][a-fa-f0-9]/pack("c",hex($1))/eg;
在傳送cgi數(shù)據(jù)的時(shí)候會(huì)把數(shù)據(jù)編碼,其中會(huì)將特殊字符或是中文字符編碼以%開頭的連續(xù)的兩個(gè)十六進(jìn)制數(shù)的字符串,所以要用s這個(gè)函數(shù)來找尋這個(gè)以%開頭的字符串。為了要把找到的字符串再做解碼的處理,所以要在%這個(gè)符號(hào)之后加上()這個(gè)符號(hào),表示會(huì)把找到的字符串記憶起來并指定給$1這個(gè)變量,而且要在()中加上********續(xù)兩個(gè)十六進(jìn)制數(shù)值的文字處理模式(regularexpression),也就是[a-fa-f0-9][a-fa-f0-9]。再用hex這個(gè)函數(shù)($1是********的字符串)把十六進(jìn)制數(shù)值轉(zhuǎn)成十進(jìn)制的碼,之后再用pack這個(gè)函數(shù)(以c為參數(shù),是********gnedcharvalue的意思)把這個(gè)十進(jìn)制碼還原成原來的字符串。最后就會(huì)把這個(gè)字符串解碼成$value="三八!"。值得一提的是也可以把這個(gè)解碼的程序?qū)懗?
$value=~s/%(..)/pack("c",hex($1))/eg;
【編輯推薦】






















