Perl操作符中綁定和乘號操作符用法解析
本文和大家重點討論一下綁定Perl操作符和乘號Perl操作符,綁定Perl操作符中雙目=~把一個字串和一個模式匹配、替換或者轉(zhuǎn)換綁定在一起,并且Perl提供類似C的Perl操作符(乘)、/(除)、和%(模除)。
綁定Perl操作符
雙目=~把一個字串和一個模式匹配、替換或者轉(zhuǎn)換綁定在一起。要不然這些操作會搜索或修改包含在$_(缺省變量)里面的字串。你想綁定的字串放在左邊,而Perl操作符本身放在右邊。返回值標(biāo)識右邊的Perl操作符的成功或者失敗,因為綁定Perl操作符本身實際上不做任何事情。
如果右邊的參數(shù)是一個表達式而不是模式匹配、子過程或者轉(zhuǎn)換,那運行時該表達式會被解釋成一個搜索模式。也就是說,$_=~$pat等效于$_=~/$pat/。這樣做要比明確搜索效率低,因為每次計算完表達式后都必須檢查模式以及可能還要重新編譯模式。你可以通過使用qr//(引起正則表達式)Perl操作符預(yù)編譯最初的模式的方法來避免重新編譯。
雙目!~類似=~Perl操作符,只是返回值是=~的對應(yīng)返回值的邏輯非。下面的表達式功能上是完全一樣的:
$string!~/pattern/
not$string=~/pattern/
我們說返回值標(biāo)識成功,但是有許多種成功。替換返回成功替換的數(shù)量,轉(zhuǎn)換也一樣。(實際上,轉(zhuǎn)換Perl操作符常用于字符計數(shù)。)因為任何非零值都是真,所以所有的都對。最吸引人的真值類型是模式的列表賦值:在列表環(huán)境下,模式匹配可以返回和模式里圓括弧相匹配的子字串。不過,根據(jù)列表賦值的規(guī)則,如果有任何東西匹配并且賦了值,列表賦值本身將返回真,否則返回假。因此,有時候你會看到這樣的東西:
if(($k,$v)=$string=~m/(\w+)=(\w*)/){
print"KEY$kVALUE$v\n";
}
讓我們分解這個例子。=~的優(yōu)先級比=高,因此首先計算=~。=~把字串$string綁定與右邊的模式進行匹配,右邊是掃描你的字串里看起來象KEY=VALUES這樣的東西。這是在列表環(huán)境里,因為它是在一個列表賦值的右邊。如果匹配了模式,它返回一個列表并賦值給$k和$v。列表賦值本身是在標(biāo)量環(huán)境,所以它返回2--賦值語句右邊的數(shù)值的個數(shù)。而2正好又是真——因為標(biāo)量環(huán)境也是一個布爾環(huán)境。當(dāng)匹配失敗,沒有賦值發(fā)生,則返回零,是假。
關(guān)于模式規(guī)則的更多內(nèi)容,參閱第五章,模式匹配。
乘號Perl操作符
Perl提供類似C的Perl操作符(乘)、/(除)、和%(模除)。和/的運行和你預(yù)料的一樣,對其兩個操作數(shù)進行乘或除。除法是以浮點數(shù)進行的,除非你用了integer用法模塊。
%Perl操作符在用整數(shù)除法計算余數(shù)前,把它的操作數(shù)轉(zhuǎn)換為整數(shù)。(不過,如果必要,它會以浮點進行除法,這樣你的操作數(shù)在大多數(shù)32位機器上最多可以有(以浮點)15位。)假設(shè)你的兩個操作數(shù)叫$b和$a。如果$b是正數(shù),那么$a%$b的結(jié)果是$a減去$b不大于$a的最大倍數(shù)(也就意味著結(jié)果總是在范圍0..$b-1之間)。如果$b是負數(shù),那么$a%$b的結(jié)果是$a減去$b不小于$a的最小倍數(shù)(意味著結(jié)果介于$b+1..0之間)。
當(dāng)useinteger在范圍里時,%直接給你由你的C編譯器實現(xiàn)的模除Perl操作符。這個Perl操作符對負數(shù)定義得不是很好,但是執(zhí)行得更快。
雙目x是復(fù)制Perl操作符。實際上,它是兩個Perl操作符,在標(biāo)量環(huán)境里,它返回一個由左操作數(shù)重復(fù)右操作數(shù)的次數(shù)連接起來的字串。(為了向下兼容,如果左操作數(shù)沒有位于圓括弧中,那么它在列表環(huán)境里也這樣處理。)
print'-'x80;#打印一行劃線
print"\t"x($tab/8),''x($tab%8);#跳過
在列表環(huán)境里,如果左操作數(shù)是在圓括弧中的列表,x的作用是一個列表復(fù)制器,而不是字串復(fù)制器。這個功能對初始化一個長度不定的數(shù)組的所有值為同一值時很有用:
@ones=(1)x80;#一個80個1的列表
@ones=(5)x@ones;#把所有元素設(shè)置為5
類似,你還可以用x初始化數(shù)組和散列片段:
@keys=qw(perlsbeforeswine);
@hash{@keys}=("")x@keys;
如果這些讓你迷惑,注意@keys被同時當(dāng)做一個列表在賦值左邊使用和當(dāng)做一個標(biāo)量值(返回數(shù)組長度)在賦值語句右邊。前面的例子在%hash上有相同的作用:
$hash{perls}="";
$hash{before}="";
$hash{swine}="";
【編輯推薦】