標籤:
Perl文法簡介
1.PERL變數
1.1.Perl變數分類
1.2.Perl變數
1.2.1 Scalar變數
1.2.2 陣列變數
1.2.3 標量與陣列變數
1.2.4 關聯陣列
2.PERL運算子
2.1 算數運算子
2.2 位元運算符
2.3 比較子
2.4 邏輯運算子
2.5 字元運算子
2.6 賦值運算子
2.7 Lvalue
2.8 表運算子
2.9 檔案測試運算子
1.PERL變數
1.1.Perl變數分類
Perl變數分為標量變數,陣列變數,關聯陣列變數3類.PERL的變數對大小寫敏感,比如:An,
AN,an是3個不同的變數,但是不同類型的變數可以使用同一個名字,比如:VAR可以是一個標量
變數,同時也可以有一個陣列變數也是VAR.這是因為PERL對每種類型的變數採用獨立的名字空
間,另外PERL的變數,可以儲存任何類型的資料,無須像C那樣聲明變數,資料類型之間會自動轉
換,同時PERL變數也有全域與過程變數之分,預設是全域變數.
1.2.Perl變數
1.2.1 Scalar變數(標量變數)
標量變數只能存放一個值.PERL中的標量變數名總以字元$開頭.下面的PERL語句把9這個
值賦給標量變數$nine.把"BATI"賦給標量變數$name.然後用PRINT語句列印出來.
$nine=9;
$name=‘BATI‘;
print($name,‘is‘,$nine);
把上述語句存為TEST01.PL檔案,然後再在DOS環境下(WIN9X的MS-DOS方式也可以)運行:
C:\PERL5>PERL TEST01.PL(斷行符號)
BATI is 9
(什麼?很眼熟??是阿,PERL和我們常用C就是這麼相似)
1.2.2 陣列變數
數組是一次能夠儲存多個變數的表.它的賦值方法如下:
@weekdays=(‘Sun‘,‘Mon‘,‘Tue‘,‘Wed‘,‘Thu‘,‘Fri‘,‘Sat‘);
print (@weekdays); #輸出為: SunMonTueWedThrFriSat
print ($weekdays[1]); #輸出為: Sun
@[email protected][1..5]; #此時,數組work的值為(‘Mon‘,‘Tue",...,‘Fri‘);
@none=(); #表示空數組
陣列變數名以@開頭,[]內是數組的下標值,下標值從0開始.這與C依然很相似.
同樣的在PERL中,如果只有數組名,而忽略下標的話,也會像C那樣輸出整個輸出,比如:
第一個輸出語句.
但請注意在輸出Sun那一句時,當我們引用數組中某一個值的時候,我們不再使用@,而是
使用$作為變數的開頭,因為就單個值而言,它是一個標量變數,所以如此(這和C可不一樣哦)
當然你還得給出下標值.
在給數組work賦值的語句中,我們用到了SLICE初始化數組,你不必關心什麼是SLICE,你
只要記住這種形式就可以了,其實SLICE是表格的一部分,是官方的表示.
對數組的賦值是多種多樣的.前面我們看到的都是用值對數組賦值,同樣你也可以用變數
或者另一個數組的值給數組賦值,比如:
@name=($firstname,@lastname);
@say=(‘He said‘,@saysomething);
以下是SLICE的例子:
@[email protected][0,6]; #數組weekend的值為(‘Sun‘,‘Sat‘)
print(@weekdays[1..5,0,6]); #輸出結果為‘MonTueWedThuFriSunSat‘
PERL還支援一種特殊構造符$#var,它是用來返回數組最後一個索引值.比如下面的語句利
用$[構造符確定數組的第一個索引值,用$#var確定數組最後的索引值,然後顯示整個數組:
for ($i=$[;$i<=$#buffer;$i++) { print $buffer[$i]; }
上面語句與print @buffer;的輸出結果是一樣的.
1.2.3 標量與陣列變數
表構造符(,)與順序計值運算子(,)非常相似.因此,PERL調用哪一個運算子取決於命令檔案
運行時的具體情況,即檔案正在使用數組還是標量值.PERL在數組運算式中調用表結構符, 在順
序計值中調用計值運算子.請考慮以下兩個運算式:
@an_array=(1,2,3,4,5);
$a_scalar=(1,2,3,4,5);
第一個語句初始化一個數組,第二句把$a_scalar變數的值設為5,而且取消了前4個元素的賦
值作用.
再來看一個例子:
print $assoc{1,2};
@print $assoc{1,2};
第一句列印二維關聯陣列的一個元素值,而第二句列印一維數組的兩個元素值.
1.2.4 關聯陣列變數
關聯陣列變數與陣列變數很相似,都可以儲存標量變數的表.它們的區別在於陣列變數必須通
過整數下標來引用數組元素, 而關聯陣列變數可以通過任何值作為下標而達到訪問數組元素的目
的.關聯陣列的下標我們稱之為索引值(Key),是一種索引值.下面我們通過一個例子來理解:
$ages{‘Bob‘}=35;
$ages{‘Mary‘}=25;
$,=‘‘;
print @ages{‘Bob‘,‘Mary‘};
print keys(%ages );
for $name(keys(%ages))
{
print "$name is $ages{$keys}\n";
}
程式把一個值賦給‘$,‘變數,這樣以後的print語句的輸出會受到影響,關於特殊變數‘$,‘我們
將在以後介紹.PERL調用關聯陣列變數時,使用花括弧{}括起索引值.
@ages{‘Bob‘,‘Mary‘}在花括弧內給出了索引值,表示引用一個元素,此語句中有兩個索引值,表示引
用數組的一部分,其結果應為(35,25)與($ages{‘Bob‘},$ages{‘Mary‘})語句的結果相同.
print keys(%ages)使用了keys運算子.其結果將返回關聯陣列的所有索引值,組成一個表.%ages
表示引用整個關聯陣列.
請注意迴圈語句中的print語句,在這裡我們看到了在""(雙引號)中插入變數的用法,這是非常有
用的.在輸出結果的時候,變數將被替換成變數的值作為輸出的最終結果,這就是所謂的插入法.但是PERL
不允許在‘‘(單引號)中插入變數!!!!
2.PERL運算子
2.1 算數運算子
PERL雖然在變數與資料類型都和C大不相同,然而它的運算子和C幾乎相同,除了C的類型
轉換運算子type,指標引用運算子*ptr和結構成員選擇符,其他C的運算子幾乎完全出現在
Perl裡,Perl新增了幾個新運算子,比如在字元處理方面.
Perl到目前支援的算數運算子有一些幾種:
+ 加法運算子
- 減法運算子
* 乘運算子
/ 除運算子(只對浮點數運算)
% 模數運算子(只對整數運算)
下面給出Perl算數運算的一些執行個體:
$x=2.5;
$y=3;
print ($x+2*$y);
print (7/$y);
print int(7/$y);
print (7%$y);
print (7.5%$y);
Perl還支援遞增和遞減運算子:
++ 遞加
-- 遞減
Perl新增了乘方運算子:**,請看下面的例子:
$x=2**3; #2的3次方
$y=2**0.5; #2的平方根
$z=-2**-3; #結果是:-0.125
2.2 位元運算符
位元運算符對二進位運算式的整數形式進行處理,運算結果為整數.如果位元運算符的運算元是
字串或分數,Perl首先把它們轉換成整數,並用32位長整數形式表示它們.Perl支
持所有的C語言運算子:
| 位或運算子
& 位與運算子
. 位非運算子
<< 位左移運算子>> 位右移運算子
有關位元運算符的詳細內容,請參看C語言有關的內容,這裡我們就不多講了,只舉幾個例子:
$x=5;
$y=3;
print $x | $y; #結果是7(二進位表示:111)
print $x & $y; #結果是1(二進位表示:001)
print $x << 2; #結果是20(二進位表示:10100) print $x>> 1; #結果是2(二進位表示:10)
2.3 比較子
比較子的功能是比較兩個運算元的值.Perl在進行比較運算前,會先將字元運算元轉換為數字.Perl用專門的字串比較運算子對純字元進行表運算.
運算子 |
等價字串 |
含義 |
|
|
等於 |
不等於 |
大於 |
小於 |
大於等於 |
小於等於 |
不等於(結果帶符號) |
|
2.4 邏輯運算子 邏輯運算子測試布林運算式的值,其結果為真或假.Perl認為邏輯運算子的每個運算元都
為布爾值(即真或假).Perl的邏輯運算子包括:
|| 邏輯或運算子;
&& 邏輯與運算子.
Perl按從左至右的順序計算邏輯運算式.當邏輯或運算子的一個運算元為真,或者當邏輯
與運算子的一個運算元為假時,Perl將終止邏輯運算式的計算.Perl利用這種短迴路計值
快速計算運算式的值.因此,這兩個運算子也叫短迴路AND和短迴路OR.
除了以上兩個運算子,還有以下三種邏輯運算子:
! 負運算子
?: 條件運算子
, 順序計值符
運算子!否定運算元的布爾值,相當於邏輯非.?:條件運算子,有3個運算元,表達形式為:
condition?true-result:false-result
下面的語句通過?:運算子,實現存取權限的區分:
$access=($user eq ‘流雲‘?‘root‘:‘guest‘);
順序運算子(,)從嚴格意義上講並不是邏輯運算子,因為它並不檢查運算元的真假.Perl
從左至右的計算逗號運算子,並返回最右邊的運算元,都好運算子是從C延續出來的,具體使用可以
參考C裡的用法,這裡我就不累述了.
2.5 字元運算子
由於Perl本身是為文本處理開發的.因此,它增加許多新的字串運算子.Perl的字元
串運算子包括:
. 字元串連運算子
x 字串複製運算子
=~ 將一個變數綁定到模式比對
!~ 將一個變數綁定到模式比對,取非
前兩個運算子比較簡單.現在看看例子:
print ‘C‘.‘a‘.‘l‘x2; #輸出結果將是: Call;
後兩個運算子主要用於模式比對,以後將會有關於模式比對的具體講解,這裡就不多說了,我們
來看看它們的例子,以瞭解它們的作用:
$text=‘今天下雨了‘;
print ($text=~/下雨/)?‘今天下雨了‘:‘今天沒下雨‘;
我們看到的例子可以發現是否變數中是否包含我們所需要的字串.
2.6 賦值運算子
賦值運算子和C語言的賦值運算子差不多,以下是各種賦值運算子:
= += -= *= /= %= |= &=
^= ~= <<=>>= **== .= x=
2.7 Lvalue
在Perl和C語言中,lvalue表示賦值運算子左邊的實體.也就是說,lvalue與變
量一樣,可以給它分配值.例如在Perl命令檔案中不能向字串賦值,如"Bob"=32這個語
句就是錯誤的!因為"Bob"不是一個lvalue,但是如果對$Bob賦值,如$Bob=32,
這個語句就是正確的!因為變數$Bob是一個lvalue.
在Perl中,任何有意義的lvalue只能表示一個實體.例如下面的第一個語句列出了表的
值(就是數組的值,只不過說法不一樣罷了),@color就是一個lvalue,第二個語句中,
將表的值賦值給3個標量變數,3個變數就是lvalue:
@color=($r,$g,$b);
($r,$g,$b)[email protected];
Perl的賦值運算子對錶進行處理時,可以不對整個表進行處理,而只針對錶的某一個或者幾個
元素進行賦值:
@times[2,5,9]=(20,40,10);
下面的語句把表的前2個值賦給兩個標量,其餘部分賦給另一個表:
($arg1,$arg2,@reset)[email protected];
2.8 表運算子
Perl包括以下一些表運算子,而C沒有:
, 表構造符
.. 範圍運算子
x 表複製運算子
前面我們在介紹"標量與陣列變數"時,已經設計到了構造符(我認為叫分隔字元,
更容易理解些)範圍運算子我們在用來建立數組下標範圍時,也用到過!不過,請注意它的功能還遠不止這個,
它還可以用來作為返回從左邊運算元到右邊運算元之間順序整數的範圍(包括左右兩邊的運算元).命令檔案通
常同時利用範圍運算子創造一個連續整數表:
@digits=0..9;
這樣我們就創造了一個表,其值為(0,1,2,3,4,5,6,7,8,9)
表複製運算子是一個非常有趣的東東,我們來看一個例子:
@copy_3=(1,2,3)x3;
這個表有9元素,其值為(1,2,3,1,2,3,1,2,3)怎麼樣?很方便吧!!:)
2.9 檔案運算子
Perl大大擴充了檔案處理運算子.Perl至少有27個運算子在不開啟檔案的情況下,能夠測試檔案
的資訊,但是很不幸,由於Perl在最初是UNIX下的工具,所以絕大多數的運算子在我們流行的平台上:
WIN9X/NT系統無法使用.但萬幸的是不是全部還有4個運算子絕對可用,而且功能不錯哦!一下就是那
4個運算子:
-d 測試檔案是不是一個目錄;
-e 測試檔案是否存在;
-s 測試檔案的大小;
-w 測試檔案是否是可寫的;
前兩個運算子返回的是布爾值(即真或假),第3個運算子返迴文件的大小(以位元組作為返回方式).下面是
使用方法:
if(-e ‘perl.exe‘)
{
print ‘File size is:‘-s‘perl.exe‘;
}
else
{
print ‘Can\‘t find perl.exe\n‘;
}
(-w ‘SomeFile‘)||die "Cannot write to SomeFile\n";
perl文法簡介