国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
perl基本語(yǔ)法

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

一.?dāng)?shù)據(jù)型態(tài)(Data type)
Perl 的數(shù)據(jù)型態(tài)大致分為四種:Scalar(變量)、Scalar Array(數(shù)組)、Hash Array(散列)、References(指針),看起來(lái)雖少但用起來(lái)卻綽綽有余。尤其在寫Perl程序時(shí)可以不必事先宣告變量,這一點(diǎn)對(duì)剛學(xué)程序語(yǔ)言的人甚為方便,不過(guò)為了以后程序除錯(cuò)和維護(hù)方便,我建議你還是養(yǎng)成事先聲明變量的習(xí)慣比較好。

1 Scalar(純量變量):
純量變量是Perl里最基本的一種數(shù)據(jù)型態(tài),它可以代表一個(gè)字符、字符串、整數(shù)、甚至浮點(diǎn)數(shù),而Perl把它們都看成是一樣的東東! 你甚至可以混著用,不可思議吧。例如:
# 井字號(hào)開(kāi)頭的后面都是批注。
# 純量變數(shù)以$開(kāi)頭。
# my 是一種宣告變量的方式,它可以使變量區(qū)域化。
# 宣告變量時(shí)若不加 my 或 local 則Perl會(huì)把它當(dāng)作全域變量使用。
# 習(xí)慣上,我們會(huì)將字符串用雙引號(hào)括起來(lái),而數(shù)值就不用加引號(hào)。
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í),底數(shù)不能為負(fù)數(shù),例如:25**1.5=125,(-25)**1.5=?(不成立)
(2)取余(%) 操作數(shù)為整數(shù),否則要截取。第二個(gè)數(shù)不能為0(因?yàn)槌龜?shù)不能為0)
(3)負(fù)(-) -$a=$a*(-1)
此外,注意當(dāng)一個(gè)字符串參加運(yùn)算,需要轉(zhuǎn)化為整數(shù)時(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時(shí),值為1;當(dāng)$a<$b時(shí),值為-1;當(dāng)$a==$b時(shí),值為0
(3)自動(dòng)把操作數(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)字符串比較的次序:字符串從左到右比較?!痑zz’<‘bc’(即:首先a與b進(jìn)行比較,然后z與c進(jìn)行比較)
(3)當(dāng)一個(gè)串是另一個(gè)的前綴時(shí),長(zhǎng)度長(zhǎng)的為大。例如:dog<doghouse
(4)字符串可以從右向左進(jìn)位,且是字母數(shù)字分別進(jìn)行
(5)自動(dòng)把操作數(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)成字符串來(lái)比較)
'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時(shí)可以直接寫print $a$b=>print $a.$b; 但是這兩者的原理是不一樣的
(2)重復(fù)( “x” ),注意:前后有空格(目的:為了和變量名分開(kāi)),例如:‘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"
即:左邊是一個(gè)字符串,右邊是該字符串出現(xiàn)的次數(shù)

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

6)、位操作運(yùn)算符
&(按位與)、 |(按位或)、 ~(按位非)、 ^(按位異或)、 <<(左移)、>>(右移)
(1)操作數(shù)為二進(jìn)制整數(shù),如果是小數(shù)則截取為整數(shù)
(2)<<左移,移開(kāi)后空位補(bǔ)0,值為原數(shù)值的2*N倍(例如:z<<4,則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)不要在變量?jī)蛇叾际褂么朔N操作符:++$var--
(2)不要在變量自增/減后在同一表達(dá)式中再次使用:$var2 = $var1 + ++$var1;
(3)可用于字符串的自增,當(dāng)z、Z、9時(shí)進(jìn)位。$a=‘caz’; $a++; ==> $a=‘cba’;
(4)不能用于字符串的自減,當(dāng)$a--時(shí),按數(shù)字運(yùn)算,字符先轉(zhuǎn)化為0再自減
(5)如果字符串含有非字母數(shù)字符號(hào),或數(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)只能用于單一變量,不能對(duì)運(yùn)算后的變量進(jìn)行。例如:($a+$b)++

9)、逗號(hào)(相當(dāng)于:將兩條語(yǔ)句寫在一行)
適用范圍: 只有當(dāng)兩個(gè)語(yǔ)句關(guān)聯(lián)緊密時(shí)才使用
例如:$a+=1,$b=$a;  => $a+=1; $b=$a;
例如:$a="ab5c", print $a."\n";

10、條件運(yùn)算符
條件? 真:假
(1)三個(gè)操作數(shù):先對(duì)條件表達(dá)式運(yùn)算,為真時(shí)執(zhí)行:的左邊的運(yùn)算,為假時(shí)執(zhí)行:的右邊的運(yùn)算
例如:$result = $var == 0 ? 14 : 7;
(2)用于簡(jiǎn)單的條件
(3)條件表達(dá)式用在=的左邊
例如:$condvar == 43 ? $var1 : $var2 = 14;
例如:$condvar == 43 ? $var1 = 14 : $var2 = 14;

三、操作符優(yōu)先級(jí)別( precedence--優(yōu)先級(jí))
當(dāng)一個(gè)表達(dá)式中出現(xiàn)幾種不同的運(yùn)算符,哪個(gè)先計(jì)算,哪個(gè)后計(jì)算
例如:$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)先級(jí)如下:自增自減最高,單操作數(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ù)組變量和列表的概念,列表是包含在括號(hào)里的一序列的值,可以為任何數(shù)值,也可為空,并且列表存貯于Perl數(shù)組變量中,與簡(jiǎn)單變量不同,Perl數(shù)組變量以字符"@"打頭。

Perl數(shù)組變量和列表

一、列表

列表是包含在括號(hào)里的一序列的值,可以為任何數(shù)值,也可為空,如:

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

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

以互相轉(zhuǎn)化或賦值。

列表例:

(17,$var,"astring")

(17,26<<2)

(17,$var1+$var2)

($value,"Theansweris$value")

二、Perl數(shù)組--列表的存貯

列表存貯于Perl數(shù)組變量中,與簡(jiǎn)單變量不同,Perl數(shù)組變量以字符"@"打頭,如:

@array=(1,2,3);

注:

(1)Perl數(shù)組變量創(chuàng)建時(shí)初始值為空列表:()。

(2)因?yàn)镻ERL用@和$來(lái)區(qū)分Perl數(shù)組變量和簡(jiǎn)單變量,所以同一個(gè)名字可以同時(shí)用于Perl

數(shù)組變量和簡(jiǎn)單變量,如:

$var=1;

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

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

1、Perl數(shù)組的存取

◆對(duì)Perl數(shù)組中的值通過(guò)下標(biāo)存取,第一個(gè)元素下標(biāo)為0。試圖訪問(wèn)不存在的Perl數(shù)組元

素,則結(jié)果為NULL,但如果給超出Perl數(shù)組大小的元素賦值,則Perl數(shù)組自動(dòng)增長(zhǎng),原

來(lái)沒(méi)有的元素值為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ù)組對(duì)簡(jiǎn)單變量的賦值

(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é)束輸入的符號(hào)

2、字符串中的方括號(hào)和變量替換

"$var[0]"為Perl數(shù)組@var的第一個(gè)元素。

"$var\[0]"將字符"["轉(zhuǎn)義,等價(jià)于"$var"."[0]",$var被變量替換,[0]保持不變。

"${var}[0]"亦等價(jià)于"$var"."[0]"。

"$\{var}"則取消了大括號(hào)的變量替換功能,包含文字:${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ù)組的長(zhǎng)度

當(dāng)Perl數(shù)組變量出現(xiàn)在預(yù)期簡(jiǎn)單變量出現(xiàn)的地方,則PERL解釋器取其長(zhǎng)度。

@array=(1,2,3);

$scalar=@array;#$scalar=3,即@array的長(zhǎng)度

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

注:以Perl數(shù)組的長(zhǎng)度為循環(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ù)組形式來(lái)交換元素:

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

7、有關(guān)Perl數(shù)組的庫(kù)函數(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(鍵盤)輸入字符串時(shí)最后一個(gè)字符--換行符。而如果它作用到Perl數(shù)組上,則將Perl數(shù)組中每一個(gè)元素都做如此處理。

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

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

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

join的第一個(gè)參數(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 常見(jiàn)用法
基本用法
# 初始化 %h為空數(shù)組%h = {};# 用數(shù)組初始化%h為 a=>1, b=>2%h = ('a', 1, 'b', 2);# 意義同上,只是另一種更形象化的寫法。%h = ('a'=>1, 'b'=>2);#如果key是字符串,可以省略引號(hào)。下面這行和上面那行是一樣的%h = (a=>1, b=>2);# 用{}來(lái)訪問(wèn)print "$h{a}\n"; # 打印1$h = '2b';print "$h\n"; # 打印2b# 刪除key用deletedelete $h; # 從$h刪除'b'
清空hash
undef %h

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

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

Hash的長(zhǎng)度
想要知道一個(gè)hash存放多少數(shù)據(jù)
$hash_size = keys %h
# 把%h的長(zhǎng)度放到$hash_size中
print scalar kes %h, "\n"
# 打印%h的長(zhǎng)度。這里用了scalar來(lái)返回?cái)?shù)組長(zhǎng)度。

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

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

傳遞hash到函數(shù)
一般都是傳遞一個(gè)reference到函數(shù)

%h = ();$h{a}=1;foo(\%h)print $h, "\n";
# 打印出2。
這個(gè)值來(lái)自于函數(shù)foo() sub foo {my ($h) = @_;print $h->{a}, "\n";
# 打印出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語(yǔ)言很像,讓使用者很快就能掌握它。不過(guò)Perl比C語(yǔ)言又另外多了些實(shí)用的語(yǔ)法,我用底線標(biāo)出來(lái),大家一看便知。

# Expression 就是條件敘述式,Perl和C一樣沒(méi)有定義布爾數(shù)據(jù)型態(tài)(Boolean datatype),
# 因此 0 是false、非0 是ture。另外要注意字符串運(yùn)算子和數(shù)值運(yùn)算子要分清楚哦。
# Code Segment 就是用大括號(hào)括起來(lái)的一堆指令,也就是一個(gè)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),我們可以使用倒裝句法,看起來(lái)比較簡(jiǎn)潔。
statement if (Expression);
# unless 就是if not
statement unless (Expression);例:
print "HELLO!\n" if ($name eq "friend");
$x-=10 if ($x == 100);
看吧! C 語(yǔ)言有的Perl大部分都有,學(xué)過(guò) C 的人可以毫不費(fèi)力的學(xué)會(huì)Perl。

2循環(huán)結(jié)構(gòu)
Perl的循環(huán)控制敘述也和C語(yǔ)言很像,當(dāng)然,照例Perl也另外多了些實(shí)用的語(yǔ)法:
# 注意:純量變數(shù)前面要加個(gè) $ 字號(hào),這一點(diǎn)和C語(yǔ)言不一樣哦。
for($i=0; $i<=10; $i++) {Code Segment}

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

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

Perl 還有提供label(標(biāo)記)的語(yǔ)法,也就是goto 指令,不過(guò)有經(jīng)驗(yàn)的programer并不喜歡用它,我也不建議大家使用,所以就此按下不講。有興趣的人請(qǐng)自行查閱。還有一點(diǎn)值得注意的是Perl沒(méi)有提供像C語(yǔ)言一樣的 switch 敘述,不過(guò)Perl的pattern match的功能非常強(qiáng),所以我建議你直接用 if else 敘述來(lái)做就好了。

3子程序(Subroutines)
(a) Syntax: sub NAME {Code}
(b) 呼叫子程序: &NAME(para1, para2,...)
(c) 參數(shù)傳遞:@_
Perl 和C一樣是采用Call by value的方式,不過(guò)因?yàn)镻erl不用事先宣告變量,所以建立子程序的時(shí)候也不用宣告要傳遞什么參數(shù)。當(dāng)主程序在傳遞參數(shù)給子程序時(shí),Perl會(huì)把括號(hào)括起來(lái)的參數(shù)按順序放在一個(gè)特殊的全域變量 @_ 數(shù)組中,然后子程序就可以隨意使用數(shù)組 @_ 里的參數(shù),例如 $_[0] 是第一個(gè)參數(shù), $_[1] 是第二個(gè),或是用 my($a1,$a2,$a3,...) = @_;來(lái)取出各個(gè)參數(shù),當(dāng)然 my @arg=@_; 或 my %arg=@_; 也是可以的。由于Perl的語(yǔ)法非常活潑,使得程序在維護(hù)時(shí)特別棘手,因此寫批注成為一項(xiàng)很重要的工作。我建議你最好在每個(gè)子程序前面加上對(duì)這段子程序的描述,特別是需要傳遞的參數(shù)要注明清楚。
(d) Variable Localization:my or local
通常我們?cè)诔绦蛑卸x的變量都是全域變量,所以在子程序中若要把變量區(qū)域化則要加上 my 或 local 關(guān)鍵詞,例如:my $x=3;,若子程序所用的變量名不小心和主程相同,Perl會(huì)以目前正在執(zhí)行的子程序里的變量為優(yōu)先。

4 I/O和檔案處理
(a) Syntax:
open(FILEHANDLE,"Expression");
close(FILEHANDLE);
這里的Expression是一個(gè)敘述加上文件名稱,若Expression只有文件名稱沒(méi)有加上敘述,則預(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.
例:
# 開(kāi)啟$filename這個(gè)檔案,若開(kāi)啟失敗則印出die后面的訊息,并結(jié)束程序。
open(FILE, $filename) || die "Can't open file $filename : $!\n";

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

# 檔案開(kāi)啟后要記得隨手關(guān)閉,這才是寫程序的好習(xí)慣。
close(FILE);

# $!和$_都是Perl的特殊變數(shù),下面會(huì)介紹的。

(b) Input:
Perl沒(méi)有特別用來(lái)輸入的函數(shù),因?yàn)镻erl在執(zhí)行程序時(shí),會(huì)自動(dòng)開(kāi)啟標(biāo)準(zhǔn)輸入裝置,其filehandle定為STDIN,所以在Perl中要輸入數(shù)據(jù)的方法就是使用:

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

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

# 不用再指定變量的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的用法:
print<XXX

這招叫做 here document,XXX可以是你取的任何標(biāo)識(shí)符,在標(biāo)識(shí)符之間的字都會(huì)按照你所寫的樣子輸出,就像\標(biāo)簽一樣。而當(dāng)一行的開(kāi)頭是XXX你取的這個(gè)標(biāo)識(shí)符時(shí),才會(huì)停止輸出。
XXX

Perl 也有和 C 一樣以 "\" 開(kāi)頭的特殊字符:
\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

另外需要說(shuō)明的是 Perl 融合了unix shell script的使用慣例,以雙引號(hào)("")括起來(lái)的字符串會(huì)先經(jīng)過(guò)展開(kāi),但反斜線(\)后面的字符則不展開(kāi),當(dāng)作一般字符看待。而以單引號(hào)('')括起來(lái)的字符串完全不會(huì)展開(kāi),以反單引號(hào)(``)括起來(lái)的字符串會(huì)把它當(dāng)作命令列指令一樣執(zhí)行,等于system()一樣。初學(xué)者常常會(huì)搞混,但習(xí)慣之后就會(huì)覺(jué)得不這樣分清楚反而不行哩,舉個(gè)例吧:
$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ù)
通過(guò) & 調(diào)用.

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

參數(shù),其余類推。

3. shift
shift 后跟一個(gè)數(shù)組,表示將數(shù)組的第一個(gè)值返回。數(shù)組也被改變,其第一個(gè)元素被彈

出。

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

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

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

# 遍歷整個(gè)@_數(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ù)組的前三個(gè)元素值相應(yīng)地賦給($first, $second, $third)
(my $first, my $second, my $third) = @_;
# 返回其和值。缺點(diǎn): 如果是求四個(gè)參數(shù)的和,依然只能給出前三個(gè)的和。
return $first + $second + $third;
}

# 辦法2
sub sumarg {
# $_[0] 表示參數(shù)數(shù)組@_的第一個(gè)元素。其余類推。
my $first = $_[0];
my $second = $_[1];
my $third = $_[2];
# 返回其和值。缺點(diǎn): 同sumvar. 只是通過(guò)這里學(xué)習(xí) $_[0] 這種用法。
return $first + $second + $third;
}

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

8總結(jié)
整理了一下自己覺(jué)得用的比較多的一些符號(hào)、用法、函數(shù)、庫(kù)之類的,這些都是很基本

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

數(shù)據(jù)操作
* $ - 聲明與引用用一個(gè)scalar的變量
* @ - 聲明與引用一個(gè)list,但是當(dāng)訪問(wèn)一個(gè)list的成員時(shí),需使用$ListName[index]
* % - 聲明與引用一個(gè)hash表,但是當(dāng)訪問(wèn)一個(gè)hash的成員時(shí),需要使用$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路徑列表,我們可以往該列表中添加我們自己的目錄來(lái)方便引

用自定義的庫(kù)
* $! - 當(dāng)前系統(tǒng)提示,錯(cuò)誤信息
* $^O - 操作系統(tǒng)的名字
* STDIN,STDOUT,STDERR - 輸入輸出的默認(rèn)句柄,可以作一定的自定義
* => - 聲明一個(gè)hash時(shí)可以用來(lái)明確的表示出key=>value的對(duì)應(yīng)關(guān)系
* $^I- 指定備份的文件的后綴名,如此,被修改的文件將會(huì)自動(dòng)以該后綴名保存一個(gè)副

特殊用法
* &Sub - 調(diào)用一個(gè)函數(shù),雖然Perl有些規(guī)則讓你在某些時(shí)候可以省略這里的&符號(hào),但

是處于一致性考慮,所以自定義的函數(shù)的調(diào)用,我一律采用此種方式。
* $# - 用來(lái)取得模個(gè)數(shù)組的最大index, 一般情況下,也可以用-1來(lái)表示最后一個(gè)元素

的index的
* qw() - 快速聲明一個(gè)字符串?dāng)?shù)組,可以省略那些煩人的引號(hào)

正則表達(dá)式
* $ - 獲取被括號(hào)捕獲的匹配
* $`, $&, $' - 獲取匹配的字符串,以及其前后兩個(gè)部分
* ^,$ - 字符串的始末位置,用作定位

常用函數(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 - 文檔屬性,時(shí)間相關(guān)函數(shù)
* hex, oct - 二進(jìn)制,八進(jìn)制,十六進(jìn)制數(shù)轉(zhuǎn)化成十進(jìn)制的函數(shù)
* grep, map - list高級(jí)操作函數(shù)

這些函數(shù)的詳細(xì)介紹,都可以通過(guò)命令:
#perldoc -f functionname
查到

常用庫(kù)
* File::Basename - 根據(jù)path獲取文件名或者文件路徑
* File::Spec - 根據(jù)文件名與路徑組合成全路經(jīng)
* File::Find - 遞歸遍歷某個(gè)目錄下所有文件
* XML::Simple - 以一個(gè)復(fù)雜的結(jié)構(gòu)來(lái)表示xml文件,使用起來(lái)相當(dāng)方便
* Time::HiRes - 經(jīng)常用來(lái)計(jì)算一個(gè)操作所耗費(fèi)的時(shí)間
* Getopt::Long - 當(dāng)腳本需要復(fù)雜的輸入?yún)?shù)與選項(xiàng)時(shí)用到
* Cwd - 拿到當(dāng)前工作目錄
* IO::File - 文件操作
* Win32 - 當(dāng)需要調(diào)用一些Windows API時(shí)我會(huì)用它

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【轉(zhuǎn)載】從C到Perl
Perl 筆記
Perl 子程序(函數(shù)) | 菜鳥教程
Perl 與 Python 之間的一些異同
Perl6 vs Perl5 之我見(jiàn)
Perl的簡(jiǎn)單語(yǔ)法(與C語(yǔ)言語(yǔ)法的異同)2
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服