perl 快速入門

本文介紹從變量類型、操作運算符、控制敘述、子程序、I/O和檔案處理、 Regular Expressions、Spectial Variables、Help、函數、總結幾個部分介紹perl,只是敘述了一些Perl的基本語法

一.數據類型(Data type):

Perl 的數據類型大致分爲四種:Scalar(變量)、Scalar Array(數組)、Hash Array(散列)、References(指針),看起來雖少但用起來卻綽綽有餘。尤其在寫Perl程序時可以不必事先宣告變量,這一點對剛學程序語言的人甚爲方便,不過爲了以後程序除錯和維護方便,我建議你還是養成事先聲明變量的習慣比較好。

1 Scalar(純量變量):

純量變量是Perl裏最基本的一種數據型態,它可以代表一個字符、字符串、整數、甚至浮點數,而Perl把它們都看成是一樣的東東! 你甚至可以混着用,不可思議吧。例如:
# 井字號開頭的後面都是批註。
# 純量變數以$開頭。
# my 是一種宣告變量的方式,它可以使變量區域化。
# 宣告變量時若不加 my 或 local 則Perl會把它當作全域變量使用。
# 習慣上,我們會將字符串用雙引號括起來,而數值就不用加引號。
my $x="abc";
my $x=123;
my $x=4.56;

1-1 常用的操作運算符

1)、算術運算符
+(加)、-(減)、*(乘)、/(除)、**(冪)、%(餘)、-(負)
(1)求冪(**) 結果不能超出數的範圍。當指數爲小數時,底數不能爲負數,例如:25**1.5=125,(-25)**1.5=?(不成立)
(2)取餘(%) 操作數爲整數,否則要截取。第二個數不能爲0(因爲除數不能爲0)
(3)負(-) -$a=$a*(-1)
此外,注意當一個字符串參加運算,需要轉化爲整數時,如果不能轉化爲整數則值爲0。例如:'2'+1=3,'a'+1=1

2)、數字比較運算符
<(小於)、=(等於)、>(大於)、==(等於)、<=(小於等於)、>=(大於等於)、!=(不等於)、<=>(比較)
(1)==:比較運算,比較的結果爲真或非零,假或零
(2)<=>:比較運算 例如:$a<=>$b,當$a>$b時,值爲1;當$a<$b時,值爲-1;當$a==$b時,值爲0
(3)自動把操作數轉化爲整數,不能轉化爲整數則爲0
(4)浮點數不精確,不要把值相近的數比較,否則得到的結果是出乎意料的

3)、字符串比較運算符
lt(小於)、gt(大於)、eq(等於)、le(小於等於)、ge(大於等於)、ne(等於)、cmp(比較)
(1)字符串的比較原則:按照字母表的順序比較,數字<大寫字母<小寫字母(a小—z大)
(2)字符串比較的次序:字符串從左到右比較。'azz'<‘bc'(即:首先a與b進行比較,然後z與c進行比較)
(3)當一個串是另一個的前綴時,長度長的爲大。例如:dog<doghouse
(4)字符串可以從右向左進位,且是字母數字分別進行
(5)自動把操作數轉化爲字符串。123 lt 45 => '123' lt '45'
(6)cmp等同於<=>,結果爲-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,這三種情況都爲假
例如:如下比較的結果
35 != 30+5 #假
35 == 35.0 #真
'35' eq '35.0' #假(當成字符串來比較)
'fred' lt 'barney' #假
'fred' lt 'free' #假
'fred' eq "fred" #真
'fred' eq "Fred" #假
' ' gt ' ' #真

4)、字符串連接(.)、字符/字符串重複(x)
(1)連接( “.“),例如:$a=‘a'.'b'; =>‘ab'
在print時可以直接寫print $a$b=>print $a.$b; 但是這兩者的原理是不一樣的
(2)重複( “x” ),注意:前後有空格(目的:爲了和變量名分開),例如:‘a' x 5=‘aaaaa',若重複次數<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"
即:左邊是一個字符串,右邊是該字符串出現的次數

5)、邏輯運算符(&&(and)(與)、||(or)(或)、!(not)(非)、xor(異或)
(1)先算左邊的值,後算右邊的值
(2)&&和and的優先級不同,但除非特殊情況,很難有區別

6)、位操作運算符
&(按位與)、 |(按位或)、 ~(按位非)、 ^(按位異或)、 <<(左移)、>>(右移)
(1)操作數爲二進制整數,如果是小數則截取爲整數
(2)<<左移,移開後空位補0,值爲原數值的2*N倍(例如:z<<4,則z=z*(2的4次方))
(3)>>右移,首位補0,值爲原值一半(並取整)(例如:z>>4,則z=z/(2的的次方))

7)、賦值運算符
=、+=、-=、*=、/=、%=、**=、&=、|=、^=、.=
(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)不要在變量自增/減後在同一表達式中再次使用:$var2 = $var1 + ++$var1;
(3)可用於字符串的自增,當z、Z、9時進位。$a=‘caz'; $a++; ==> $a=‘cba';
(4)不能用於字符串的自減,當$a--時,按數字運算,字符先轉化爲0再自減
(5)如果字符串含有非字母數字符號,或數字位於字母中時,自增也先化爲0再自增
例如:$a=‘ab*c'; $a++; ==> $a=1;
例如:$a=‘ab5c'; $a++; ==> $a=1;
(6)預增$b=++$a,$a先自增再賦值,後增$b=$a++;$a先賦值再自增;反之,同理
例如:$a=1; $b=++$a; =>$a=2,$b=2;
例如:$a=1; $b=$a++; =>$a=2,$b=1;
(7)只能用於單一變量,不能對運算後的變量進行。例如:($a+$b)++

9)、逗號(相當於:將兩條語句寫在一行)
適用範圍: 只有當兩個語句關聯緊密時才使用
例如:$a+=1,$b=$a; => $a+=1; $b=$a;
例如:$a="ab5c", print $a."\n";

10、條件運算符
條件? 真:假
(1)三個操作數:先對條件表達式運算,爲真時執行:的左邊的運算,爲假時執行:的右邊的運算
例如:$result = $var == 0 ? 14 : 7;
(2)用於簡單的條件
(3)條件表達式用在=的左邊
例如:$condvar == 43 ? $var1 : $var2 = 14;
例如:$condvar == 43 ? $var1 = 14 : $var2 = 14;

三、操作符優先級別( precedence--優先級)
當一個表達式中出現幾種不同的運算符,哪個先計算,哪個後計算
例如:$condvar == 43 ? $var1 : $var2 = 14;(先算條件,後算賦值)
例如:$x = $a == $b;(先算關係,後算賦值)
例如:$x == 0 || $y / $x > 5;(先算除,接着算大於、接着算等於,最後算關係或)
例如:$result = 11 * 2 + 6 ** 2 << 2;(先算冪,再算乘,接着算加,再接着算左移,最後算賦值)
(1)一般的優先級如下:自增自減最高,單操作數高於多操作數,數字運算 > 比較運算(數字比較與字符串比較) > 位運算 > 賦值運算 > 邏輯運算
(2)數字運算:冪 > */>+-
(3)比較運算: <(小於)、>(大於)高於(== 與!=)

2 Scalar Array:
Perl數組變量和列表的概念,列表是包含在括號裏的一序列的值,可以爲任何數值,也可爲空,並且列表存貯於Perl數組變量中,與簡單變量不同,Perl數組變量以字符"@"打頭。

Perl數組變量和列表

一、列表

列表是包含在括號裏的一序列的值,可以爲任何數值,也可爲空,如:

(1,5.3,"hello",2),空列表:()。

注:只含有一個數值的列表(如:(43.2))與該數值本身(即:43.2)是不同的,但它們可

以互相轉化或賦值。

列表例:

(17,$var,"astring")

(17,26<<2)

(17,$var1+$var2)

($value,"Theansweris$value")

二、Perl數組--列表的存貯

列表存貯於Perl數組變量中,與簡單變量不同,Perl數組變量以字符"@"打頭,如:

@array=(1,2,3);

注:

(1)Perl數組變量創建時初始值爲空列表:()。

(2)因爲PERL用@和$來區分Perl數組變量和簡單變量,所以同一個名字可以同時用於Perl

數組變量和簡單變量,如:

$var=1;

@var=(11,27.1,"astring");

但這樣很容易混淆,故不推薦。

1、Perl數組的存取

◆對Perl數組中的值通過下標存取,第一個元素下標爲0。試圖訪問不存在的Perl數組元

素,則結果爲NULL,但如果給超出Perl數組大小的元素賦值,則Perl數組自動增長,原

來沒有的元素值爲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數組間拷貝

@result=@original;

◆用Perl數組給列表賦值

@list1=(2,3,4);

@list2=(1,@list1,5);#@list2=(1,2,3,4,5)

◆Perl數組對簡單變量的賦值

(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)

◆從標準輸入(STDIN)給變量賦值

$var=<STDIN>;

@array=<STDIN>;#^D爲結束輸入的符號

2、字符串中的方括號和變量替換

"$var[0]"爲Perl數組@var的第一個元素。

"$var\[0]"將字符"["轉義,等價於"$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)

◆用於實數

(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")

◆可包含變量或表達式

($var1..$var2+5)

◆小技巧:

$fred="Fred";

print(("Hello,".$fred."!\n")x2);

其結果爲:

Hello,Fred!

Hello,Fred!

4、Perl數組的輸出:

(1)@array=(1,2,3);

print(@array,"\n");

結果爲:

123

(2)@array=(1,2,3);

print("@array\n");

結果爲:

123

5、列表/Perl數組的長度

當Perl數組變量出現在預期簡單變量出現的地方,則PERL解釋器取其長度。

@array=(1,2,3);

$scalar=@array;#$scalar=3,即@array的長度

($scalar)=@array;#$scalar=1,即@array第一個元素的值

注:以Perl數組的長度爲循環次數可如下編程:

$count=1;

while($count<=@array){

print("element$count:$array[$count-1]\n");

$count++;

}

6、子Perl數組

@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數組形式來交換元素:

@array[1,2]=@array[2,1];

7、有關Perl數組的庫函數

(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--反轉Perl數組

@array2=reverse(@array);

@array2=reversesort(@array);

(3)chop--Perl數組去尾

chop的意義是去掉STDIN(鍵盤)輸入字符串時最後一個字符--換行符。而如果它作用到Perl數組上,則將Perl數組中每一個元素都做如此處理。

@list=("rabbit","12345","quartz");

chop(@list);#@list=("rabbi","1234","quart")now

(4)join/split--連接/拆分

join的第一個參數是連接所用的中間字符,其餘則爲待連接的字符Perl數組。

$string=join("","this","is","a","string");#結果爲"thisisastring"

@list=("words","and");

$string=join("::",@list,"colons");#結果爲"words::and::colons"

@array=split(/::/,$string);#@array=("words","and","colons")now

3 Hash Array(Associative Array):
perl hash 常見用法
基本用法
# 初始化 %h爲空數組%h = {};# 用數組初始化%h爲 a=>1, b=>2%h = ('a', 1, 'b', 2);# 意義同上,只是另一種更形象化的寫法。%h = ('a'=>1, 'b'=>2);#如果key是字符串,可以省略引號。下面這行和上面那行是一樣的%h = (a=>1, b=>2);# 用{}來訪問print "$h{a}\n"; # 打印1$h{b} = '2b';print "$h{b}\n"; # 打印2b# 刪除key用deletedelete $h{b}; # 從$h刪除'b'
清空hash
undef %h

得到hash的所有鍵值
# 得到所有keys,順序取決於hash函數,或者說是亂序
@all_keys = keys %h;
# 所有鍵值,是按hash的值從大往小排列的。值的比較是數字比較(比如說,10>9)
@all_keys = sort{$h{$b}<=>$h{$a}} (keys %h);
# 所有鍵值,是按hash的值從小往大排列的。值的比較是數字比較
@all_keys = sort{$h{$a}<=>$h{$b}} (keys %h);
# 所有鍵值,是按hash的值從小往大排列的。值的比較是字符串比較(比如說,'10' < '9')
@all_keys = sort{$h{$a} cmp $h{$b}} (keys %h);

判斷hash是否包含key
exists($h{$key});

Hash的長度
想要知道一個hash存放多少數據
$hash_size = keys %h
# 把%h的長度放到$hash_size中
print scalar kes %h, "\n"
# 打印%h的長度。這裏用了scalar來返回數組長度。

遍歷一個hash
while (my ($k, $v) = each %h) {print "$k ---> $v\n";}

Reference引用
Reference類似於C/C++的指針
$h_ref = \%h;
# 獲得一個hash的reference%aHash = %{$h_ref};
# 把hash reference當成hash用$value = $h_ref->{akey}
# 這個和%h{akey}是一樣的

傳遞hash到函數
一般都是傳遞一個reference到函數

%h = ();$h{a}=1;foo(\%h)print $h{b}, "\n";
# 打印出2。
這個值來自於函數foo() sub foo {my ($h) = @_;print $h->{a}, "\n";
# 打印出1$h->{b} = 2;}

函數返回hash,或者hash引用(hash reference)
函數可以返回hash
sub foo {my %fh;$fh{a} = 1;return %h;} my %h = foo();print

二 控制結構(Control Statements)
1 選擇 if結構

Perl的條件控制敘述和C語言很像,讓使用者很快就能掌握它。不過Perl比C語言又另外多了些實用的語法,我用底線標出來,大家一看便知。

# Expression 就是條件敘述式,Perl和C一樣沒有定義布爾數據型態(Boolean datatype),
# 因此 0 是false、非0 是ture。另外要注意字符串運算子和數值運算子要分清楚哦。
# 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)只有一項,我們可以使用倒裝句法,看起來比較簡潔。
statement if (Expression);
# unless 就是if not
statement unless (Expression);例:
print "HELLO!\n" if ($name eq "friend");
$x-=10 if ($x == 100);
看吧! C 語言有的Perl大部分都有,學過 C 的人可以毫不費力的學會Perl。

2循環結構
Perl的循環控制敘述也和C語言很像,當然,照例Perl也另外多了些實用的語法:
# 注意:純量變數前面要加個 $ 字號,這一點和C語言不一樣哦。
for($i=0; $i<=10; $i++) {Code Segment}

# foreach 是承襲UNIX的shell script來的,
# 第一個自變量是純量變數,第二個自變量要用括號括起來,裏面是一個純量數組,
# 顧名思義它就是把數組中的每個元素依序傳給第一個自變量,直到全部傳完。
# 它和 for($i=0; $i<=$#array; $i++) 用法雖然不同,但目的都是要取出數組的每個元素。
foreach $i (@array) {Code Segment}
# 其實在Perl中,for和foreach是可以混着用的,就看個的人習慣了。
# 下面這行就等於上面第一個敘述,不過簡潔多了,大家可以試着用用看。
for $i (0..10) {Code Segment}

# while控制循環和後置循環。
while($i<=10) {Code Segment}
do {Code Segment} while(Expression);
# Perl也有和C語言的break和continue一樣的指令,Perl叫它做 last 和 next (較口語化)。
# last是跳出現在所在的循環,next則是跳過下面的指令直接執行下一次的循環。
while(chomp($i=)) {
next if ($i == 5);
last unless ($i > 10);
}

Perl 還有提供label(標記)的語法,也就是goto 指令,不過有經驗的programer並不喜歡用它,我也不建議大家使用,所以就此按下不講。有興趣的人請自行查閱。還有一點值得注意的是Perl沒有提供像C語言一樣的 switch 敘述,不過Perl的pattern match的功能非常強,所以我建議你直接用 if else 敘述來做就好了。

3子程序(Subroutines)
(a) Syntax: sub NAME {Code}
(b) 呼叫子程序: &NAME(para1, para2,...)
(c) 參數傳遞:@_
Perl 和C一樣是採用Call by value的方式,不過因爲Perl不用事先宣告變量,所以建立子程序的時候也不用宣告要傳遞什麼參數。當主程序在傳遞參數給子程序時,Perl會把括號括起來的參數按順序放在一個特殊的全域變量 @_ 數組中,然後子程序就可以隨意使用數組 @_ 裏的參數,例如 $_[0] 是第一個參數, $_[1] 是第二個,或是用 my($a1,$a2,$a3,...) = @_;來取出各個參數,當然 my @arg=@_; 或 my %arg=@_; 也是可以的。由於Perl的語法非常活潑,使得程序在維護時特別棘手,因此寫批註成爲一項很重要的工作。我建議你最好在每個子程序前面加上對這段子程序的描述,特別是需要傳遞的參數要註明清楚。
(d) Variable Localization:my or local
通常我們在程序中定義的變量都是全域變量,所以在子程序中若要把變量區域化則要加上 my 或 local 關鍵詞,例如:my $x=3;,若子程序所用的變量名不小心和主程相同,Perl會以目前正在執行的子程序裏的變量爲優先。

4 I/O和檔案處理
(a) Syntax:
open(FILEHANDLE,"Expression");
close(FILEHANDLE);
這裏的Expression是一個敘述加上文件名稱,若Expression只有文件名稱沒有加上敘述,則預設是隻讀。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後面的訊息,並結束程序。
open(FILE, $filename) || die "Can't open file $filename : $!\n";

# 下面是一個十分精簡的寫法,和 while($_=){print "$_";} 是等效的。
print while();

# 檔案開啓後要記得隨手關閉,這纔是寫程序的好習慣。
close(FILE);

# $!和$_都是Perl的特殊變數,下面會介紹的。

(b) Input:
Perl沒有特別用來輸入的函數,因爲Perl在執行程序時,會自動開啓標準輸入裝置,其filehandle定爲STDIN,所以在Perl中要輸入數據的方法就是使用:

# Perl不會自動去掉結尾的CR/LF,跟C語言不同,所以要用chomp函數幫你去掉它。
# 大家常常會忘記這個動作,導致結果跟你想的不一樣,要特別注意一下。
$input=<STDIN>; chomp $input;
# 下面是較簡潔的寫法。
chomp($input=<STDIN>);

(c) Output:print "variables or 字符串";
Perl也有printf()函數,語法和C語言一模一樣,我就不多做介紹了。Perl另外有個print函數,比printf()更方便、更好用,包你愛不釋手。Output不外乎是輸出到屏幕或檔案,用例子來說明比較容易瞭解。

# 不用再指定變量的data type,這樣不是比printf()方便多了嗎?
print "Scalar value is $x\n";

# . 是字符串加法的運算子,上下這兩行是等效的。
print "Scalar value is " . $x . "\n";

# 輸出到檔案的方法。
print FILE "print $x to a file.";

# 下面是print的特殊用法,學自shell script的用法:
print<XXX

這招叫做 here document,XXX可以是你取的任何標識符,在標識符之間的字都會按照你所寫的樣子輸出,就像\標籤一樣。而當一行的開頭是XXX你取的這個標識符時,纔會停止輸出。
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的使用慣例,以雙引號("")括起來的字符串會先經過展開,但反斜線(\)後面的字符則不展開,當作一般字符看待。而以單引號('')括起來的字符串完全不會展開,以反單引號(``)括起來的字符串會把它當作命令列指令一樣執行,等於system()一樣。初學者常常會搞混,但習慣之後就會覺得不這樣分清楚反而不行哩,舉個例吧:
$x="ls -l";
print "$x"; # Output ls -l
print "\$x"; # Output $x
print '$x'; # Output $x
print `$x`; # Output files in this directory

函數
1. Perl函數
通過 & 調用.

2. Perl參數
Perl天然支持可變數目個參數。
在函數內部,所有參數按順序放在數組 @_ 中,在函數內部,$_[0] 表示函數的第一個

參數,其餘類推。

3. shift
shift 後跟一個數組,表示將數組的第一個值返回。數組也被改變,其第一個元素被彈

出。

演示代碼一(求最大值):
#!/usr/bin/perl -w
use strict;
# 調用函數max,取得一組數值的最大值,並輸出。
my $maxCnt = &max(11,22,33);
print "maxCnt=$maxCnt\n";

sub max {
# 採用遍歷算法。先將參數中的第一個值賦給$currentMaxCnt。
# @_ 是默認的包含本函數所有參數 [如(11,22,33)]的數組。
# shift @_ 有兩個結果: 1. 將數組 @_ 中的第一個值做爲返回值(賦給了

$currentMaxCnt). 2. 將@_數組第一個值彈出[此後@_的值變爲(22,33)].
my $currentMaxCnt = shift @_;
# 函數中使用shift時,@_可以省略。上面代碼也可以寫成這樣。
# my $currentMaxCnt = shift;

# 遍歷整個@_數組。
foreach ( @_ ) {
# $_ 表示數組@_中當前被遍歷到的元素.
if ( $_ > $currentMaxCnt ) {
# 如果發現當前數組元素比$currentMaxCnt大,那就將$currentMaxCnt重新賦值爲當前

元素。
$currentMaxCnt = $_;
}
}
# 函數返回值爲標量$currentMaxCnt.
return $currentMaxCnt;
}

演示代碼二(求和):
#!/usr/bin/perl -w
use strict;

# 求一組數的和並打印。
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 {
# 將參數數組的前三個元素值相應地賦給($first, $second, $third)
(my $first, my $second, my $third) = @_;
# 返回其和值。缺點: 如果是求四個參數的和,依然只能給出前三個的和。
return $first + $second + $third;
}

# 辦法2
sub sumarg {
# $_[0] 表示參數數組@_的第一個元素。其餘類推。
my $first = $_[0];
my $second = $_[1];
my $third = $_[2];
# 返回其和值。缺點: 同sumvar. 只是通過這裏學習 $_[0] 這種用法。
return $first + $second + $third;
}

# 辦法3, 參數可以任意多。都能求其和。
sub sumgod{
my $s = shift @_;
foreach ( @_ ) {
$s = $s + $_;
}
# 同前面函數max。
return $s;
}

8總結
整理了一下自己覺得用的比較多的一些符號、用法、函數、庫之類的,這些都是很基本

的,但是“背熟”了,對提高效率會很有幫助。

數據操作
* $ - 聲明與引用用一個scalar的變量
* @ - 聲明與引用一個list,但是當訪問一個list的成員時,需使用$ListName[index]
* % - 聲明與引用一個hash表,但是當訪問一個hash的成員時,需要使用$HashName

{key}

特殊變量
* $0 - 當前運行腳本的文件名
* @ARGV - 當前運行腳本的命令行參數列表
* $_ - 默認變量,如循環中的當前變量
* @_ - 函數的輸入參數列表
* %ENV - 系統的環境變量
* @INC - Perl的Include路徑列表,我們可以往該列表中添加我們自己的目錄來方便引

用自定義的庫
* $! - 當前系統提示,錯誤信息
* $^O - 操作系統的名字
* STDIN,STDOUT,STDERR - 輸入輸出的默認句柄,可以作一定的自定義
* => - 聲明一個hash時可以用來明確的表示出key=>value的對應關係
* $^I- 指定備份的文件的後綴名,如此,被修改的文件將會自動以該後綴名保存一個副

特殊用法
* &Sub - 調用一個函數,雖然Perl有些規則讓你在某些時候可以省略這裏的&符號,但

是處於一致性考慮,所以自定義的函數的調用,我一律採用此種方式。
* $# - 用來取得模個數組的最大index, 一般情況下,也可以用-1來表示最後一個元素

的index的
* qw() - 快速聲明一個字符串數組,可以省略那些煩人的引號

正則表達式
* $ - 獲取被括號捕獲的匹配
* $`, $&, $' - 獲取匹配的字符串,以及其前後兩個部分
* ^,$ - 字符串的始末位置,用作定位

常用函數
* pop, push, shift, unshift, reverse - list的操作函數
* keys,values, exists, each, delete - hash的操作函數
* chomp, split, join, index, substr, sort - 字符串操作函數
* sprintf,printf, print - 格式化輸出函數
* system, exec, `` - 系統命令調用函數
* glob, unlink, mkdir, rmdir, rename,chmod,chown, open, close, opendir,

closedir - 文件系統操作函數
* stat, lstat,localtime,gmtime,utime - 文檔屬性,時間相關函數
* hex, oct - 二進制,八進制,十六進制數轉化成十進制的函數
* grep, map - list高級操作函數

這些函數的詳細介紹,都可以通過命令:
#perldoc -f functionname
查到

常用庫
* File::Basename - 根據path獲取文件名或者文件路徑
* File::Spec - 根據文件名與路徑組合成全路經
* File::Find - 遞歸遍歷某個目錄下所有文件
* XML::Simple - 以一個複雜的結構來表示xml文件,使用起來相當方便
* Time::HiRes - 經常用來計算一個操作所耗費的時間
* Getopt::Long - 當腳本需要複雜的輸入參數與選項時用到
* Cwd - 拿到當前工作目錄
* IO::File - 文件操作
* Win32 - 當需要調用一些Windows API時我會用它


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章