一.數據類型(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 經常使用的操做運算符shell
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 ' ' #真less
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的的次方))ui
7)、賦值運算符
=、+=、-=、*=、/=、%=、**=、&=、|=、^=、.=
(1)$a+=1=>$a=$a+1
(2)能夠連等$a=$b=3;=>$a=3;$b=3;
(3)混用 ($a=$b)+=3;=>$a=$b;$a=$a+3;(不建議使用)this
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";
十、條件運算符
條件? 真:假
(1)三個操做數:先對條件表達式運算,爲真時執行:的左邊的運算,爲假時執行:的右邊的運算
例如:$result = $var == 0 ? 14 : 7;
(2)用於簡單的條件
(3)條件表達式用在=的左邊
例如:$condvar == 43 ? $var1 : $var2 = 14;
例如:$condvar == 43 ? $var1 = 14 : $var2 = 14;
3、操做符優先級別( 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、列表
列表是包含在括號裏的一序列的值,能夠爲任何數值,也可爲空,如:
(1,5.3,"hello",2),空列表:()。
注:只含有一個數值的列表(如:(43.2))與該數值自己(即:43.2)是不一樣的,但它們可
以互相轉化或賦值。
列表例:
(17,$var,"astring")
(17,26<<2)
(17,$var1+$var2)
($value,"Theansweris$value")
2、Perl數組--列表的存貯
列表存貯於Perl數組變量中,與簡單變量不一樣,Perl數組變量以字符"@"打頭,如:
@array=(1,2,3);
注:
(1)Perl數組變量建立時初始值爲空列表:()。
(2)由於PERL用@和$來區分Perl數組變量和簡單變量,因此同一個名字能夠同時用於Perl
數組變量和簡單變量,如:
$var=1;
@var=(11,27.1,"astring");
但這樣很容易混淆,故不推薦。
一、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爲結束輸入的符號
二、字符串中的方括號和變量替換
"$var[0]"爲Perl數組@var的第一個元素。
"$var\[0]"將字符"["轉義,等價於"$var"."[0]",$var被變量替換,[0]保持不變。
"${var}[0]"亦等價於"$var"."[0]"。
"$\{var}"則取消了大括號的變量替換功能,包含文字:${var}.
三、列表範圍:
(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!
四、Perl數組的輸出:
(1)@array=(1,2,3);
print(@array,"\n");
結果爲:
123
(2)@array=(1,2,3);
print("@array\n");
結果爲:
123
五、列表/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++;
}
六、子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];
七、有關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時我會用它