一.資料類型(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() - 快速聲明一個字串數組,可以省略那些煩人的引號
Regex
* $ - 擷取被括弧捕獲的匹配
* $`, $&, $' - 擷取匹配的字串,以及其前後兩個部分
* ^,$ - 字串的始末位置,用作定位
常用函數
* 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時我會用它