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