a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > Perl > 正文

簡(jiǎn)單敘述Perl的基本語(yǔ)法

2020-02-23 19:47:51
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一.?dāng)?shù)據(jù)類(lèi)型(Data type)

Perl 的數(shù)據(jù)類(lèi)型大致分為四種:Scalar(變量)、Scalar Array(數(shù)組)、Hash Array(散列)、References(指針),看起來(lái)雖少但用起來(lái)卻綽綽有余。尤其在寫(xiě)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 (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ù)字 (2)字符串比較的次序:字符串從左到右比較。'azz' (3)當(dāng)一個(gè)串是另一個(gè)的前綴時(shí),長(zhǎng)度長(zhǎng)的為大。例如:dog (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í)可以直接寫(xiě)print $a$b=>print $a.$b; 但是這兩者的原理是不一樣的
(2)重復(fù)( “x” ),注意:前后有空格(目的:為了和變量名分開(kāi)),例如:‘a(chǎn)'? x? 5=‘a(chǎn)aaaa',若重復(fù)次數(shù) 例如:"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) (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ǔ)句寫(xiě)在一行)
適用范圍: 只有當(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 (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

(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=;

@array=;#^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

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(鍵盤(pán))輸入字符串時(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.html" target="_blank">perl hash 常見(jiàn)用法
基本用法
# 初始化 %h為空數(shù)組%h = {};# 用數(shù)組初始化%h為 a=>1, b=>2%h = ('a', 1, 'b', 2);# 意義同上,只是另一種更形象化的寫(xiě)法。%h = ('a'=>1, 'b'=>2);#如果key是字符串,可以省略引號(hào)。下面這行和上面那行是一樣的%h = (a=>1, b=>2);# 用{}來(lái)訪問(wèn)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函數(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' @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類(lèi)似于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{b}, "/n";
# 打印出2。
這個(gè)值來(lái)自于函數(shù)foo() sub foo {my ($h) = @_;print $h->{a}, "/n";
# 打印出1$h->{b} = 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

# foreach 是承襲UNIX的shell script來(lái)的,
# 第一個(gè)自變量是純量變數(shù),第二個(gè)自變量要用括號(hào)括起來(lái),里面是一個(gè)純量數(shù)組,
# 顧名思義它就是把數(shù)組中的每個(gè)元素依序傳給第一個(gè)自變量,直到全部傳完。
# 它和 for($i=0; $i 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 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ě)批注成為一項(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è)敘述加上文件名稱(chēng),若Expression只有文件名稱(chēng)沒(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, " 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)的寫(xiě)法,和 while($_=){print "$_";} 是等效的。
print while();

# 檔案開(kāi)啟后要記得隨手關(guān)閉,這才是寫(xiě)程序的好習(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=; chomp $input;
# 下面是較簡(jiǎn)潔的寫(xiě)法。
chomp($input=);

(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

這招叫做 here document,XXX可以是你取的任何標(biāo)識(shí)符,在標(biāo)識(shí)符之間的字都會(huì)按照你所寫(xiě)的樣子輸出,就像/標(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ù),其余類(lèi)推。

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í),@_可以省略。上面代碼也可以寫(xiě)成這樣。
#? 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è)元素。其余類(lèi)推。
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ù)之類(lèi)的,這些都是很基本

的,但是“背熟”了,對(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ì)用它

以上就是簡(jiǎn)單敘述Perl的基本語(yǔ)法的全部?jī)?nèi)容,感謝大家的閱讀,更多內(nèi)容請(qǐng)關(guān)注武林技術(shù)頻道網(wǎng)站。

?

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 91精品国产欧美一区二区成人 | 久久精av| 欧美精品一区二区三区在线 | 久久精品国产久精国产 | 国产精品久久久久aaaa九色 | 亚洲看片网站 | 日韩美女中文字幕 | 1000部羞羞视频在线看视频 | 亚洲一区二区精品 | 亚洲一区二区三区精品视频 | 2018国产大陆天天弄 | 又大又粗又长又黄视频 | 日韩欧美精品 | av下一页 | 91在线观看视频 | 欧美亚洲免费 | 超碰8| 99热首页 | 午夜无码国产理论在线 | 欧美日韩精品一区二区 | 免费国产一区二区 | 日韩91 | 欧美成人手机在线视频 | 黄色一级片黄色一级片 | 久久精品国产99国产精品 | 在线观看成人小视频 | 福利二区视频 | 成人sese | 亚洲一区二区av | 日本精品视频在线观看 | 超碰青青草原 | 超碰偷拍| av一级毛片 | 伊人精品影院 | 18视频免费网址在线观看 | 91视频国产一区 | 亚洲国产精品久久 | 国产自在线 | 成人午夜免费视频 | 午夜激情视频在线观看 | 亚洲影视一区二区 |