一.?dāng)?shù)據(jù)類型(Data type):
Perl 的數(shù)據(jù)類型大致分為四種:Scalar(變量)、Scalar Array(數(shù)組)、Hash Array(散列)、References(指針),看起來雖少但用起來卻綽綽有余。尤其在寫Perl程序時可以不必事先宣告變量,這一點(diǎn)對剛學(xué)程序語言的人甚為方便,不過為了以后程序除錯和維護(hù)方便,我建議你還是養(yǎng)成事先聲明變量的習(xí)慣比較好。
1 Scalar(純量變量):
純量變量是Perl里最基本的一種數(shù)據(jù)型態(tài),它可以代表一個字符、字符串、整數(shù)、甚至浮點(diǎn)數(shù),而Perl把它們都看成是一樣的東東! 你甚至可以混著用,不可思議吧。例如:
# 井字號開頭的后面都是批注。
# 純量變數(shù)以$開頭。
# my 是一種宣告變量的方式,它可以使變量區(qū)域化。
# 宣告變量時若不加 my 或 local 則Perl會把它當(dāng)作全域變量使用。
# 習(xí)慣上,我們會將字符串用雙引號括起來,而數(shù)值就不用加引號。
my $x="abc";
my $x=123;
my $x=4.56;
1-1 常用的操作運(yùn)算符
1)、算術(shù)運(yùn)算符
+(加)、-(減)、*(乘)、/(除)、**(冪)、%(余)、-(負(fù))
(1)求冪(**) 結(jié)果不能超出數(shù)的范圍。當(dāng)指數(shù)為小數(shù)時,底數(shù)不能為負(fù)數(shù),例如:25**1.5=125,(-25)**1.5=?(不成立)
(2)取余(%) 操作數(shù)為整數(shù),否則要截取。第二個數(shù)不能為0(因?yàn)槌龜?shù)不能為0)
(3)負(fù)(-) -$a=$a*(-1)
此外,注意當(dāng)一個字符串參加運(yùn)算,需要轉(zhuǎn)化為整數(shù)時,如果不能轉(zhuǎn)化為整數(shù)則值為0。例如:'2'+1=3,'a'+1=1
2)、數(shù)字比較運(yùn)算符
(小于)、=(等于)、>(大于)、==(等于)、=(小于等于)、>=(大于等于)、!=(不等于)、=>(比較)
(1)==:比較運(yùn)算,比較的結(jié)果為真或非零,假或零
(2)=>:比較運(yùn)算 例如:$a=>$b,當(dāng)$a>$b時,值為1;當(dāng)$a$b時,值為-1;當(dāng)$a==$b時,值為0
(3)自動把操作數(shù)轉(zhuǎn)化為整數(shù),不能轉(zhuǎn)化為整數(shù)則為0
(4)浮點(diǎn)數(shù)不精確,不要把值相近的數(shù)比較,否則得到的結(jié)果是出乎意料的
3)、字符串比較運(yùn)算符
lt(小于)、gt(大于)、eq(等于)、le(小于等于)、ge(大于等于)、ne(等于)、cmp(比較)
(1)字符串的比較原則:按照字母表的順序比較,數(shù)字大寫字母小寫字母(a小—z大)
(2)字符串比較的次序:字符串從左到右比較。'azz'‘bc'(即:首先a與b進(jìn)行比較,然后z與c進(jìn)行比較)
(3)當(dāng)一個串是另一個的前綴時,長度長的為大。例如:dogdoghouse
(4)字符串可以從右向左進(jìn)位,且是字母數(shù)字分別進(jìn)行
(5)自動把操作數(shù)轉(zhuǎn)化為字符串。123 lt 45 => '123' lt '45'
(6)cmp等同于=>,結(jié)果為-1,0, 1
例如:$str1=”a”,$str2=”a“,則print ($str1 cmp $str2) ==> 0
例如:$str1=”a”,$str2=”b”,則print($str1 cmp $str2)===> -1
例如:$str1=”b”,$str2=”a”,則print($str1 cmp $str2)===> 1
(7)空串,0,Undef,這三種情況都為假
例如:如下比較的結(jié)果
35 != 30+5 #假
35 == 35.0 #真
'35' eq '35.0' #假(當(dāng)成字符串來比較)
'fred' lt 'barney' #假
'fred' lt 'free' #假
'fred' eq "fred" #真
'fred' eq "Fred" #假
' ' gt ' ' #真
4)、字符串連接(.)、字符/字符串重復(fù)(x)
(1)連接( “.“),例如:$a=‘a(chǎn)'.'b'; =>‘a(chǎn)b'
在print時可以直接寫print $a$b=>print $a.$b; 但是這兩者的原理是不一樣的
(2)重復(fù)( “x” ),注意:前后有空格(目的:為了和變量名分開),例如:‘a(chǎn)' x 5=‘a(chǎn)aaaa',若重復(fù)次數(shù)1,則返回空串
例如:"5" x 4,即為:"5555"
例如:"love" x (4+1),即為:"lovelovelovelovelove"
例如:"4.8" x 4,即為:"4.84.84.84.8"
例如:6.1 x 3,即為:"6.16.16.1"
即:左邊是一個字符串,右邊是該字符串出現(xiàn)的次數(shù)
5)、邏輯運(yùn)算符((and)(與)、||(or)(或)、!(not)(非)、xor(異或)
(1)先算左邊的值,后算右邊的值
(2)和and的優(yōu)先級不同,但除非特殊情況,很難有區(qū)別
6)、位操作運(yùn)算符
(按位與)、 |(按位或)、 ~(按位非)、 ^(按位異或)、 (左移)、>>(右移)
(1)操作數(shù)為二進(jìn)制整數(shù),如果是小數(shù)則截取為整數(shù)
(2)左移,移開后空位補(bǔ)0,值為原數(shù)值的2*N倍(例如:z4,則z=z*(2的4次方))
(3)>>右移,首位補(bǔ)0,值為原值一半(并取整)(例如:z>>4,則z=z/(2的的次方))
7)、賦值運(yùn)算符
=、+=、-=、*=、/=、%=、**=、=、|=、^=、.=
(1)$a+=1=>$a=$a+1
(2)可以連等$a=$b=3;=>$a=3;$b=3;
(3)混用 ($a=$b)+=3;=>$a=$b;$a=$a+3;(不建議使用)
8)、自增(++)、自減(--)
(1)不要在變量兩邊都使用此種操作符:++$var--
(2)不要在變量自增/減后在同一表達(dá)式中再次使用:$var2 = $var1 + ++$var1;
(3)可用于字符串的自增,當(dāng)z、Z、9時進(jìn)位。$a=‘caz'; $a++; ==> $a=‘cba';
(4)不能用于字符串的自減,當(dāng)$a--時,按數(shù)字運(yùn)算,字符先轉(zhuǎn)化為0再自減
(5)如果字符串含有非字母數(shù)字符號,或數(shù)字位于字母中時,自增也先化為0再自增
例如:$a=‘a(chǎn)b*c'; $a++; ==> $a=1;
例如:$a=‘a(chǎn)b5c'; $a++; ==> $a=1;
(6)預(yù)增$b=++$a,$a先自增再賦值,后增$b=$a++;$a先賦值再自增;反之,同理
例如:$a=1; $b=++$a; =>$a=2,$b=2;
例如:$a=1; $b=$a++; =>$a=2,$b=1;
(7)只能用于單一變量,不能對運(yùn)算后的變量進(jìn)行。例如:($a+$b)++
9)、逗號(相當(dāng)于:將兩條語句寫在一行)
適用范圍: 只有當(dāng)兩個語句關(guān)聯(lián)緊密時才使用
例如:$a+=1,$b=$a; => $a+=1; $b=$a;
例如:$a="ab5c", print $a."\n";
10、條件運(yùn)算符
條件? 真:假
(1)三個操作數(shù):先對條件表達(dá)式運(yùn)算,為真時執(zhí)行:的左邊的運(yùn)算,為假時執(zhí)行:的右邊的運(yùn)算
例如:$result = $var == 0 ? 14 : 7;
(2)用于簡單的條件
(3)條件表達(dá)式用在=的左邊
例如:$condvar == 43 ? $var1 : $var2 = 14;
例如:$condvar == 43 ? $var1 = 14 : $var2 = 14;
三、操作符優(yōu)先級別( precedence--優(yōu)先級)
當(dāng)一個表達(dá)式中出現(xiàn)幾種不同的運(yùn)算符,哪個先計算,哪個后計算
例如:$condvar == 43 ? $var1 : $var2 = 14;(先算條件,后算賦值)
例如:$x = $a == $b;(先算關(guān)系,后算賦值)
例如:$x == 0 || $y / $x > 5;(先算除,接著算大于、接著算等于,最后算關(guān)系或)
例如:$result = 11 * 2 + 6 ** 2 2;(先算冪,再算乘,接著算加,再接著算左移,最后算賦值)
(1)一般的優(yōu)先級如下:自增自減最高,單操作數(shù)高于多操作數(shù),數(shù)字運(yùn)算 > 比較運(yùn)算(數(shù)字比較與字符串比較) > 位運(yùn)算 > 賦值運(yùn)算 > 邏輯運(yùn)算
(2)數(shù)字運(yùn)算:冪 > */>+-
(3)比較運(yùn)算: (小于)、>(大于)高于(== 與!=)
2 Scalar Array:
Perl數(shù)組變量和列表的概念,列表是包含在括號里的一序列的值,可以為任何數(shù)值,也可為空,并且列表存貯于Perl數(shù)組變量中,與簡單變量不同,Perl數(shù)組變量以字符"@"打頭。
Perl數(shù)組變量和列表
一、列表
列表是包含在括號里的一序列的值,可以為任何數(shù)值,也可為空,如:
(1,5.3,"hello",2),空列表:()。
注:只含有一個數(shù)值的列表(如:(43.2))與該數(shù)值本身(即:43.2)是不同的,但它們可
以互相轉(zhuǎn)化或賦值。
列表例:
(17,$var,"astring")
(17,262)
(17,$var1+$var2)
($value,"Theansweris$value")
二、Perl數(shù)組--列表的存貯
列表存貯于Perl數(shù)組變量中,與簡單變量不同,Perl數(shù)組變量以字符"@"打頭,如:
@array=(1,2,3);
注:
(1)Perl數(shù)組變量創(chuàng)建時初始值為空列表:()。
(2)因?yàn)镻ERL用@和$來區(qū)分Perl數(shù)組變量和簡單變量,所以同一個名字可以同時用于Perl
數(shù)組變量和簡單變量,如:
$var=1;
@var=(11,27.1,"astring");
但這樣很容易混淆,故不推薦。
1、Perl數(shù)組的存取
◆對Perl數(shù)組中的值通過下標(biāo)存取,第一個元素下標(biāo)為0。試圖訪問不存在的Perl數(shù)組元
素,則結(jié)果為NULL,但如果給超出Perl數(shù)組大小的元素賦值,則Perl數(shù)組自動增長,原
來沒有的元素值為NULL。如:
@array=(1,2,3,4);
$scalar=$array[0];
$array[3]=5;#now@arrayis(1,2,3,5)
$scalar=$array[4];#now$scalar=null;
$array[6]=17;#now@arrayis(1,2,3,5,"","",17)
◆Perl數(shù)組間拷貝
@result=@original;
◆用Perl數(shù)組給列表賦值
@list1=(2,3,4);
@list2=(1,@list1,5);#@list2=(1,2,3,4,5)
◆Perl數(shù)組對簡單變量的賦值
(1)@array=(5,7,11);
($var1,$var2)=@array;#$var1=5,$var2=7,11被忽略
(2)@array=(5,7);
($var1,$var2,$var3)=@array;#$var1=5,$var2=7,$var3=""(null)
◆從標(biāo)準(zhǔn)輸入(STDIN)給變量賦值
$var=STDIN>;
@array=STDIN>;#^D為結(jié)束輸入的符號
2、字符串中的方括號和變量替換
"$var[0]"為Perl數(shù)組@var的第一個元素。
"$var\[0]"將字符"["轉(zhuǎn)義,等價于"$var"."[0]",$var被變量替換,[0]保持不變。
"${var}[0]"亦等價于"$var"."[0]"。
"$\{var}"則取消了大括號的變量替換功能,包含文字:${var}.
3、列表范圍:
(1..10)=(1,2,3,4,5,6,7,8,9,10)
(2,5..7,11)=(2,5,6,7,11)
(3..3)=(3)
◆用于實(shí)數(shù)
(2.1..5.3)=(2.1,3.1,4.1,5.1)
(4.5..1.6)=()
◆用于字符串
("aaa".."aad")=("aaa","aab","aac","aad")
@day_of_month=("01".."31")
◆可包含變量或表達(dá)式
($var1..$var2+5)
◆小技巧:
$fred="Fred";
print(("Hello,".$fred."!\n")x2);
其結(jié)果為:
Hello,Fred!
Hello,Fred!
4、Perl數(shù)組的輸出:
(1)@array=(1,2,3);
print(@array,"\n");
結(jié)果為:
123
(2)@array=(1,2,3);
print("@array\n");
結(jié)果為:
123
5、列表/Perl數(shù)組的長度
當(dāng)Perl數(shù)組變量出現(xiàn)在預(yù)期簡單變量出現(xiàn)的地方,則PERL解釋器取其長度。
@array=(1,2,3);
$scalar=@array;#$scalar=3,即@array的長度
($scalar)=@array;#$scalar=1,即@array第一個元素的值
注:以Perl數(shù)組的長度為循環(huán)次數(shù)可如下編程:
$count=1;
while($count=@array){
print("element$count:$array[$count-1]\n");
$count++;
}
6、子Perl數(shù)組
@array=(1,2,3,4,5);
@subarray=@array[0,1];#@subarray=(1,2)
@subarray2=@array[1..3];#@subarray2=(2,3,4)
@array[0,1]=("string",46);#@array=("string",46,3,4,5)now
@array[0..3]=(11,22,33,44);#@array=(11,22,33,44,5)now
@array[1,2,3]=@array[3,2,4];#@array=(11,44,33,5,5)now
@array[0..2]=@array[3,4];#@array=(5,5,"",5,5)now
可以用子Perl數(shù)組形式來交換元素:
@array[1,2]=@array[2,1];
7、有關(guān)Perl數(shù)組的庫函數(shù)
(1)sort--按字符順序排序
@array=("this","is","a","test");
@array2=sort(@array);#@array2=("a","is","test","this")
@array=(70,100,8);
@array=sort(@array);#@array=(100,70,8)now
(2)reverse--反轉(zhuǎn)Perl數(shù)組
@array2=reverse(@array);
@array2=reversesort(@array);
(3)chop--Perl數(shù)組去尾
chop的意義是去掉STDIN(鍵盤)輸入字符串時最后一個字符--換行符。而如果它作用到Perl數(shù)組上,則將Perl數(shù)組中每一個元素都做如此處理。
@list=("rabbit","12345","quartz");
chop(@list);#@list=("rabbi","1234","quart")now
(4)join/split--連接/拆分
join的第一個參數(shù)是連接所用的中間字符,其余則為待連接的字符Perl數(shù)組。
$string=join("","this","is","a","string");#結(jié)果為"thisisastring"
@list=("words","and");
$string=join("::",@list,"colons");#結(jié)果為"words::and::colons"
@array=split(/::/,$string);#@array=("words","and","colons")now
3 Hash Array(Associative Array):
perl hash 常見用法
基本用法
# 初始化 %h為空數(shù)組%h = {};# 用數(shù)組初始化%h為 a=>1, b=>2%h = ('a', 1, 'b', 2);# 意義同上,只是另一種更形象化的寫法。%h = ('a'=>1, 'b'=>2);#如果key是字符串,可以省略引號。下面這行和上面那行是一樣的%h = (a=>1, b=>2);# 用{}來訪問print quot;$h{a}\nquot;; # 打印1$h = '2b';print quot;$h\nquot;; # 打印2b# 刪除key用deletedelete $h; # 從$h刪除'b'
清空hash
undef %h
得到hash的所有鍵值
# 得到所有keys,順序取決于hash函數(shù),或者說是亂序
@all_keys = keys %h;
# 所有鍵值,是按hash的值從大往小排列的。值的比較是數(shù)字比較(比如說,10>9)
@all_keys = sort{$h{$b}lt;=>$h{$a}} (keys %h);
# 所有鍵值,是按hash的值從小往大排列的。值的比較是數(shù)字比較
@all_keys = sort{$h{$a}lt;=>$h{$b}} (keys %h);
# 所有鍵值,是按hash的值從小往大排列的。值的比較是字符串比較(比如說,'10' lt; '9')
@all_keys = sort{$h{$a} cmp $h{$b}} (keys %h);
判斷hash是否包含key
exists($h{$key});
Hash的長度
想要知道一個hash存放多少數(shù)據(jù)
$hash_size = keys %h
# 把%h的長度放到$hash_size中
print scalar kes %h, quot;\nquot;
# 打印%h的長度。這里用了scalar來返回數(shù)組長度。
遍歷一個hash
while (my ($k, $v) = each %h) {print quot;$k ---> $v\nquot;;}
Reference引用
Reference類似于C/C++的指針
$h_ref = \%h;
# 獲得一個hash的reference%aHash = %{$h_ref};
# 把hash reference當(dāng)成hash用$value = $h_ref->{akey}
# 這個和%h{akey}是一樣的
傳遞hash到函數(shù)
一般都是傳遞一個reference到函數(shù)
%h = ();$h{a}=1;foo(\%h)print $h, quot;\nquot;;
# 打印出2。
這個值來自于函數(shù)foo() sub foo {my ($h) = @_;print $h->{a}, quot;\nquot;;
# 打印出1$h-> = 2;}
函數(shù)返回hash,或者h(yuǎn)ash引用(hash reference)
函數(shù)可以返回hash
sub foo {my %fh;$fh{a} = 1;return %h;} my %h = foo();print
二 控制結(jié)構(gòu)(Control Statements)
1 選擇 if結(jié)構(gòu)
Perl的條件控制敘述和C語言很像,讓使用者很快就能掌握它。不過Perl比C語言又另外多了些實(shí)用的語法,我用底線標(biāo)出來,大家一看便知。
# Expression 就是條件敘述式,Perl和C一樣沒有定義布爾數(shù)據(jù)型態(tài)(Boolean datatype),
# 因此 0 是false、非0 是ture。另外要注意字符串運(yùn)算子和數(shù)值運(yùn)算子要分清楚哦。
# Code Segment 就是用大括號括起來的一堆指令,也就是一個Block。
if (Expression) {Code Segment}
if (Expression) {Code Segment} else {Code Segment}
if (Expression) {Code Segment} elsif (Expression) {Code Segment} else {CodeSegment}
# elsif 就是 else if
# 如果指令(statement)只有一項(xiàng),我們可以使用倒裝句法,看起來比較簡潔。
statement if (Expression);
# unless 就是if not
statement unless (Expression);例:
print "HELLO!\n" if ($name eq "friend");
$x-=10 if ($x == 100);
看吧! C 語言有的Perl大部分都有,學(xué)過 C 的人可以毫不費(fèi)力的學(xué)會Perl。
2循環(huán)結(jié)構(gòu)
Perl的循環(huán)控制敘述也和C語言很像,當(dāng)然,照例Perl也另外多了些實(shí)用的語法:
# 注意:純量變數(shù)前面要加個 $ 字號,這一點(diǎn)和C語言不一樣哦。
for($i=0; $i=10; $i++) {Code Segment}
# foreach 是承襲UNIX的shell script來的,
# 第一個自變量是純量變數(shù),第二個自變量要用括號括起來,里面是一個純量數(shù)組,
# 顧名思義它就是把數(shù)組中的每個元素依序傳給第一個自變量,直到全部傳完。
# 它和 for($i=0; $i=$#array; $i++) 用法雖然不同,但目的都是要取出數(shù)組的每個元素。
foreach $i (@array) {Code Segment}
# 其實(shí)在Perl中,for和foreach是可以混著用的,就看個的人習(xí)慣了。
# 下面這行就等于上面第一個敘述,不過簡潔多了,大家可以試著用用看。
for $i (0..10) {Code Segment}
# while控制循環(huán)和后置循環(huán)。
while($i=10) {Code Segment}
do {Code Segment} while(Expression);
# Perl也有和C語言的break和continue一樣的指令,Perl叫它做 last 和 next (較口語化)。
# last是跳出現(xiàn)在所在的循環(huán),next則是跳過下面的指令直接執(zhí)行下一次的循環(huán)。
while(chomp($i=)) {
next if ($i == 5);
last unless ($i > 10);
}
Perl 還有提供label(標(biāo)記)的語法,也就是goto 指令,不過有經(jīng)驗(yàn)的programer并不喜歡用它,我也不建議大家使用,所以就此按下不講。有興趣的人請自行查閱。還有一點(diǎn)值得注意的是Perl沒有提供像C語言一樣的 switch 敘述,不過Perl的pattern match的功能非常強(qiáng),所以我建議你直接用 if else 敘述來做就好了。
3子程序(Subroutines)
(a) Syntax: sub NAME {Code}
(b) 呼叫子程序: NAME(para1, para2,...)
(c) 參數(shù)傳遞:@_
Perl 和C一樣是采用Call by value的方式,不過因?yàn)镻erl不用事先宣告變量,所以建立子程序的時候也不用宣告要傳遞什么參數(shù)。當(dāng)主程序在傳遞參數(shù)給子程序時,Perl會把括號括起來的參數(shù)按順序放在一個特殊的全域變量 @_ 數(shù)組中,然后子程序就可以隨意使用數(shù)組 @_ 里的參數(shù),例如 $_[0] 是第一個參數(shù), $_[1] 是第二個,或是用 my($a1,$a2,$a3,...) = @_;來取出各個參數(shù),當(dāng)然 my @arg=@_; 或 my %arg=@_; 也是可以的。由于Perl的語法非?;顫?,使得程序在維護(hù)時特別棘手,因此寫批注成為一項(xiàng)很重要的工作。我建議你最好在每個子程序前面加上對這段子程序的描述,特別是需要傳遞的參數(shù)要注明清楚。
(d) Variable Localization:my or local
通常我們在程序中定義的變量都是全域變量,所以在子程序中若要把變量區(qū)域化則要加上 my 或 local 關(guān)鍵詞,例如:my $x=3;,若子程序所用的變量名不小心和主程相同,Perl會以目前正在執(zhí)行的子程序里的變量為優(yōu)先。
4 I/O和檔案處理
(a) Syntax:
open(FILEHANDLE,"Expression");
close(FILEHANDLE);
這里的Expression是一個敘述加上文件名稱,若Expression只有文件名稱沒有加上敘述,則預(yù)設(shè)是只讀。Expressions敘述如下:
Expression Effect
open(FH, " filename")
open(FH, "+filename")
open(FH, ">filename") Opens filename for writing.
open(FH, "+>filename") Opens filename for both reading and writing.
open(FH, ">>filename") Appends to filename.
open(FH, "command|") Runs the command and pipes its output to thefilehandle.
open(FH, "command|") Pipes the output along the filehandle to thecommand.
open(FH, "-") Opens STDIN.
open(FH, ">-") Opens STDOUT.
open(FH, "=N") Where N is a number, this performs the equivalent of C'sfdopen for reading.
open(FH, ">=N") Where N is a number, this performs the equivalent of C'sfdopen for writing.
例:
# 開啟$filename這個檔案,若開啟失敗則印出die后面的訊息,并結(jié)束程序。
open(FILE, $filename) || die "Can't open file $filename : $!\n";
# 下面是一個十分精簡的寫法,和 while($_=){print "$_";} 是等效的。
print while();
# 檔案開啟后要記得隨手關(guān)閉,這才是寫程序的好習(xí)慣。
close(FILE);
# $!和$_都是Perl的特殊變數(shù),下面會介紹的。
(b) Input:
Perl沒有特別用來輸入的函數(shù),因?yàn)镻erl在執(zhí)行程序時,會自動開啟標(biāo)準(zhǔn)輸入裝置,其filehandle定為STDIN,所以在Perl中要輸入數(shù)據(jù)的方法就是使用:
# Perl不會自動去掉結(jié)尾的CR/LF,跟C語言不同,所以要用chomp函數(shù)幫你去掉它。
# 大家常常會忘記這個動作,導(dǎo)致結(jié)果跟你想的不一樣,要特別注意一下。
$input=STDIN>; chomp $input;
# 下面是較簡潔的寫法。
chomp($input=STDIN>);
(c) Output:print "variables or 字符串";
Perl也有printf()函數(shù),語法和C語言一模一樣,我就不多做介紹了。Perl另外有個print函數(shù),比printf()更方便、更好用,包你愛不釋手。Output不外乎是輸出到屏幕或檔案,用例子來說明比較容易了解。
# 不用再指定變量的data type,這樣不是比printf()方便多了嗎?
print "Scalar value is $x\n";
# . 是字符串加法的運(yùn)算子,上下這兩行是等效的。
print "Scalar value is " . $x . "\n";
# 輸出到檔案的方法。
print FILE "print $x to a file.";
# 下面是print的特殊用法,學(xué)自shell script的用法:
printXXX
這招叫做 here document,XXX可以是你取的任何標(biāo)識符,在標(biāo)識符之間的字都會按照你所寫的樣子輸出,就像\標(biāo)簽一樣。而當(dāng)一行的開頭是XXX你取的這個標(biāo)識符時,才會停止輸出。
XXX
Perl 也有和 C 一樣以 "\" 開頭的特殊字符:
\t tab
\n newline
\r return
\f form feed
\b backspace
\a alarm(bell)
\e escape
\033 octalchar
\x1b hex char
\c[ control char
\l lowercase next char
\u uppercase next char
\L lowercase till \E
\U uppercase till \E
\E end case modification
\Q quoteregexp metacharacters till \E
另外需要說明的是 Perl 融合了unix shell script的使用慣例,以雙引號("")括起來的字符串會先經(jīng)過展開,但反斜線(\)后面的字符則不展開,當(dāng)作一般字符看待。而以單引號('')括起來的字符串完全不會展開,以反單引號(``)括起來的字符串會把它當(dāng)作命令列指令一樣執(zhí)行,等于system()一樣。初學(xué)者常常會搞混,但習(xí)慣之后就會覺得不這樣分清楚反而不行哩,舉個例吧:
$x="ls -l";
print "$x"; # Output ls -l
print "\$x"; # Output $x
print '$x'; # Output $x
print `$x`; # Output files in this directory
函數(shù)
1. Perl函數(shù)
通過 調(diào)用.
2. Perl參數(shù)
Perl天然支持可變數(shù)目個參數(shù)。
在函數(shù)內(nèi)部,所有參數(shù)按順序放在數(shù)組 @_ 中,在函數(shù)內(nèi)部,$_[0] 表示函數(shù)的第一個
參數(shù),其余類推。
3. shift
shift 后跟一個數(shù)組,表示將數(shù)組的第一個值返回。數(shù)組也被改變,其第一個元素被彈
出。
演示代碼一(求最大值):
#!/usr/bin/perl -w
use strict;
# 調(diào)用函數(shù)max,取得一組數(shù)值的最大值,并輸出。
my $maxCnt = max(11,22,33);
print "maxCnt=$maxCnt\n";
sub max {
# 采用遍歷算法。先將參數(shù)中的第一個值賦給$currentMaxCnt。
# @_ 是默認(rèn)的包含本函數(shù)所有參數(shù) [如(11,22,33)]的數(shù)組。
# shift @_ 有兩個結(jié)果: 1. 將數(shù)組 @_ 中的第一個值做為返回值(賦給了
$currentMaxCnt). 2. 將@_數(shù)組第一個值彈出[此后@_的值變?yōu)?22,33)].
my $currentMaxCnt = shift @_;
# 函數(shù)中使用shift時,@_可以省略。上面代碼也可以寫成這樣。
# my $currentMaxCnt = shift;
# 遍歷整個@_數(shù)組。
foreach ( @_ ) {
# $_ 表示數(shù)組@_中當(dāng)前被遍歷到的元素.
if ( $_ > $currentMaxCnt ) {
# 如果發(fā)現(xiàn)當(dāng)前數(shù)組元素比$currentMaxCnt大,那就將$currentMaxCnt重新賦值為當(dāng)前
元素。
$currentMaxCnt = $_;
}
}
# 函數(shù)返回值為標(biāo)量$currentMaxCnt.
return $currentMaxCnt;
}
演示代碼二(求和):
#!/usr/bin/perl -w
use strict;
# 求一組數(shù)的和并打印。
my $s1 = sumvar(11,22,33);
my $s2 = sumarg(22,33,44);
my $s3 = sumgod(11,22,33,44,55);
print "s1=$s1, s2=$s2, s3=$s3\n";
# 辦法1
sub sumvar {
# 將參數(shù)數(shù)組的前三個元素值相應(yīng)地賦給($first, $second, $third)
(my $first, my $second, my $third) = @_;
# 返回其和值。缺點(diǎn): 如果是求四個參數(shù)的和,依然只能給出前三個的和。
return $first + $second + $third;
}
# 辦法2
sub sumarg {
# $_[0] 表示參數(shù)數(shù)組@_的第一個元素。其余類推。
my $first = $_[0];
my $second = $_[1];
my $third = $_[2];
# 返回其和值。缺點(diǎn): 同sumvar. 只是通過這里學(xué)習(xí) $_[0] 這種用法。
return $first + $second + $third;
}
# 辦法3, 參數(shù)可以任意多。都能求其和。
sub sumgod{
my $s = shift @_;
foreach ( @_ ) {
$s = $s + $_;
}
# 同前面函數(shù)max。
return $s;
}
8總結(jié)
整理了一下自己覺得用的比較多的一些符號、用法、函數(shù)、庫之類的,這些都是很基本
的,但是“背熟”了,對提高效率會很有幫助。
數(shù)據(jù)操作
* $ - 聲明與引用用一個scalar的變量
* @ - 聲明與引用一個list,但是當(dāng)訪問一個list的成員時,需使用$ListName[index]
* % - 聲明與引用一個hash表,但是當(dāng)訪問一個hash的成員時,需要使用$HashName
{key}
特殊變量
* $0 - 當(dāng)前運(yùn)行腳本的文件名
* @ARGV - 當(dāng)前運(yùn)行腳本的命令行參數(shù)列表
* $_ - 默認(rèn)變量,如循環(huán)中的當(dāng)前變量
* @_ - 函數(shù)的輸入?yún)?shù)列表
* %ENV - 系統(tǒng)的環(huán)境變量
* @INC - Perl的Include路徑列表,我們可以往該列表中添加我們自己的目錄來方便引
用自定義的庫
* $! - 當(dāng)前系統(tǒng)提示,錯誤信息
* $^O - 操作系統(tǒng)的名字
* STDIN,STDOUT,STDERR - 輸入輸出的默認(rèn)句柄,可以作一定的自定義
* => - 聲明一個hash時可以用來明確的表示出key=>value的對應(yīng)關(guān)系
* $^I- 指定備份的文件的后綴名,如此,被修改的文件將會自動以該后綴名保存一個副
本
特殊用法
* Sub - 調(diào)用一個函數(shù),雖然Perl有些規(guī)則讓你在某些時候可以省略這里的符號,但
是處于一致性考慮,所以自定義的函數(shù)的調(diào)用,我一律采用此種方式。
* $# - 用來取得模個數(shù)組的最大index, 一般情況下,也可以用-1來表示最后一個元素
的index的
* qw() - 快速聲明一個字符串?dāng)?shù)組,可以省略那些煩人的引號
正則表達(dá)式
* $ - 獲取被括號捕獲的匹配
* $`, $, $' - 獲取匹配的字符串,以及其前后兩個部分
* ^,$ - 字符串的始末位置,用作定位
常用函數(shù)
* pop, push, shift, unshift, reverse - list的操作函數(shù)
* keys,values, exists, each, delete - hash的操作函數(shù)
* chomp, split, join, index, substr, sort - 字符串操作函數(shù)
* sprintf,printf, print - 格式化輸出函數(shù)
* system, exec, `` - 系統(tǒng)命令調(diào)用函數(shù)
* glob, unlink, mkdir, rmdir, rename,chmod,chown, open, close, opendir,
closedir - 文件系統(tǒng)操作函數(shù)
* stat, lstat,localtime,gmtime,utime - 文檔屬性,時間相關(guān)函數(shù)
* hex, oct - 二進(jìn)制,八進(jìn)制,十六進(jìn)制數(shù)轉(zhuǎn)化成十進(jìn)制的函數(shù)
* grep, map - list高級操作函數(shù)
這些函數(shù)的詳細(xì)介紹,都可以通過命令:
#perldoc -f functionname
查到
常用庫
* File::Basename - 根據(jù)path獲取文件名或者文件路徑
* File::Spec - 根據(jù)文件名與路徑組合成全路經(jīng)
* File::Find - 遞歸遍歷某個目錄下所有文件
* XML::Simple - 以一個復(fù)雜的結(jié)構(gòu)來表示xml文件,使用起來相當(dāng)方便
* Time::HiRes - 經(jīng)常用來計算一個操作所耗費(fèi)的時間
* Getopt::Long - 當(dāng)腳本需要復(fù)雜的輸入?yún)?shù)與選項(xiàng)時用到
* Cwd - 拿到當(dāng)前工作目錄
* IO::File - 文件操作
* Win32 - 當(dāng)需要調(diào)用一些Windows API時我會用它
您可能感興趣的文章:- perl操作符詳細(xì)說明
- perl 模式匹配參數(shù)詳解
- 一篇文章搞懂:詞法作用域、動態(tài)作用域、回調(diào)函數(shù)及閉包