作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
1.shell和Perl的區別和聯絡
perl十足一個萬金油,從自身內部就實現了各種系統命令的功能,在效率上高許多,而且有專門的調試工具,支援物件導向,不論是小指令碼還是大型應用程式都可勝任。
shell指令碼本身只適用於簡單的系統管理,個人覺得shell象粘合劑,把各種linux系統命令粘在一起形成指令碼,所以你還要學習awk、sed等等,由於shell多是調用外部程式執行操作,所以效率方面較低,還有就是shell指令碼調試起來不方便,所以用shell寫500行以上的指令碼會很累。
聯絡:他們都是一種解釋性程式設計語言。
2.Perl和C語言一樣,一個語句由一個分號結尾。
3.在Perl語言中,變數在使用前不需要申明資料類型,即變數是沒有類型的。你可以將一個字串賦給一個變數,在這之後,你可以將一個數字賦給同一個變數。一個變數是什麼類型的,是由對這個變數指定什麼樣的處理來決定的。通常
是在變數名前面加一個類型修飾符來表明該變數的類型。
4.資料結構
Perl有三種資料結構:單值,數組,關聯陣列(就是"雜湊表")。
1)單值(scalar)變數
單值變數名通常以$符號開始
e.g. $mystr = “Hello world.” ; $mynum = 321;
其中有3種表示字串的方法,好記的是,它們與shell指令碼的規則是一樣的。
雙引號("):在程式裡,Perl會把字串中變數替換掉。
單引號(’):在 Perl程式中不會做任何特別處理。
反引號(`): Perl會把這個字串作為shell的命令來執行(作為一個獨立的進程),並把結果作為該字串的結果。
2)列表(數組)變數
列表的大小是動態可擴充的。列表由圓括弧(( ))包含的,以逗號(,)分隔的元素組成。每個元素可以通過它在列表中的位置來引用。第一個位置的索引是0。也可以用方括弧([])來引用列表中的一部分。
e.g.以下定義了一個四個字串的列表,並且將這個列表的索引為0的元素(Mon)賦值給單值變數monday.
$monday = ("Mon.","Tus.","Fri.","Sun.")[0];
而 ("Mon.","Tus.","Fri.","Sun.")[1,3];這句的結果也是一個列表——"Mon","Fri"
聲明列表通常以@符號開始,並且在使用的時候,使用首碼$或者@來告訴Perl解譯器某個變數的類型。e.g.@rev = reverse(@num1234); $num1 = $num1234[0];
Perl提供了一些函數用來處理列表:
sort(LIST) 對LIST排序,返回一個列表
reverse(LIST) 對LIST反序,返回一個列表
join(EXPR,LIST) 返回EXPR和LIST的組合列表
split(PATTERN,EXPR) 返回由PATTERN分隔的EXPR的子列表
push(@ARRAY,LIST) 把列表LIST加到@ARRAY尾部
pop(@ARRAY) 從@ARRAY尾部移去一個元素
unshift(@ARRAY,LIST) 在@ARRAY前面加入列表LIST
shift(@ARRAY) 移去並返回@ARRAY的第一個元素
scalar(@ARRAY) 返回數組的元素數目
3)關聯陣列變數
Perl提供了一種基於key=>value方式的關聯陣列。這類數組中,通過key來索引元素的值(value)。這裡的key是字串。關聯陣列變數名通常以%符號開始,如%myvar,
在關聯陣列中,用大括弧({ })來表示以key來索引元素。
%myhash = (“first”=>”First element”, “second”=>”Second element”,
“third”=>”Third element”);
$secondelement = $myhash{“second”};
在Perl語言內部,通過雜湊表來儲存關聯陣列的,通過對key取雜湊運算
來定位元素的位置。所以,關聯陣列又叫雜湊表。
Perl提供了一些函數來處理關聯陣列:
keys(%ARRAY) 返回關聯陣列%ARRAY的所有的key組成的列表
values(%ARRAY) 返回關聯陣列%ARRAY的所有的value組成的列表
each(%ARRAY) 每次調用的時候,就返回由一對key和value組成的列表
delete($ARRAY{KEY}) 從數組%ARRAY中刪除由key關聯的元素
5.輸入
想從檔案讀入時,把檔案名稱作為指令碼執行時的參數附在指令碼名稱後邊就可以了。Perl解譯器在解釋運行指令碼的時候,會把該檔案開啟,並把其中的每一行讀入,賦值給變數$_。
你可能寫了幾個檔案名稱字作為命令列參數,比如:
lines foo bar zap
這意味著指令碼lines將檔案foo, bar, 和 zap 作為一個已經合并的單個檔案來
處理。
6.輸出
print 與shell中的printf非常類似
7.條件測試和真值
Perl提供了2套條件測試方法,一套用於數字,一套用於字串:
比較測試 字串 數字
相等 eq ==
不等 ne !=
大於 gt >
大於等於 ge >=
小於 lt <
小於等於 le <=
比較,返回-1,0,1
cmp <=>
可以用&& (AND) 和|| (OR) 來組合測試運算。
真值問題在Perl中很靈活。
下面的值作為真值(true)來處理:
1;
("a","b"); #有元素的列表
" "; #空格符 (注意這個)
"hello"; #非Null 字元串
"00" #這個實際上也是非Null 字元串
下面的值作為false來處理:
0;
(); # 空的列表
""; # Null 字元串
"0"; # 這個也是false!(注意這個)
8.控制結構
Perl有豐富的控制結構。可以用if語句來實現分支結構,while語句來實現循
環結構。除了if和while,Perl還提供了一個foreach語句,大大方便了對數組的
處理。注意,一個程式塊的大括弧是必須的,這和C語言略有不同。
if語句的格式是:
if(expression)
{
block
}
if(expression)
{
block1
}
else
{
block2
}
while語句的格式如下:
while(expression)
{
block
}
last語句告訴Perl解譯器,該語句是迴圈體中最後執行的語句。執行這條語
句後,將退出該迴圈體。這個語句和C語言中的break功能類似。
next 語句告訴 Perl 解譯器,執行一次新的迴圈。這個語句和 C 語言中的
continue類似。
在Perl語言中,除了支援和C語言類似的for語句外,還有一個foreach語
句。該語句極大方便了對數組的操作。
foreach 單值變數 ( 列表 )
{
block
}
每次迴圈的時候,SCALAR 的值是 LIST 中的下一個值,然後執行STATEMENTS語句。
9.過程
Perl也提供過程,方便代碼重用。
Perl語言通過下面的格式來定義過程:
sub NAME
{
STATEMENTS;
}
所有的過程都通過列表(數組@_)來傳遞參數,而過程的傳回值可以是單值,也可以是列表。
sub error
{
($message) = @_;
print("<b>ERROR:<b>",
$message,
" /n");
exit(0);
}
10.檔案測試操作符
下面是部分常用的檔案測試操作符列表:
-r 可讀
-x 可執行
-e 存在
-d 是目錄
-t 是tty
-T 是文字檔
11.檔案管理
Perl語言還提供了對檔案I/O操作的強大支援。支援重新導向的方式類似,<、 >、 >>和|操作符。
open(FD,FILENAME);
close(FD);
它類似於C語言中的宏常量,作為控制代碼而存在
"FILE" 開啟一個檔案FILE,作為資料輸入,也可以寫做"<FILE"
"> FILE" 開啟一個檔案FILE,作為輸出,如果檔案不存在,就建立
">> FILE" 以追加方式開啟檔案FILE,資料都添加在檔案後面
"+> FILE" 以讀寫方式開啟檔案FILE
"| CMD" 開啟一個到CMD的管道(pipe)
"CMD |" 開啟一個以CMD為輸入的管道
# 從FILEHANDLE所指向的檔案中讀入一行
$line = <FILEHANDLE>;
# 從FILEHANDLE所指向的檔案中讀入整個檔案
@lines = <FILEHANDLE>;
在Perl中,用print寫檔案。Print的第一個選擇性參數是FILEHANDLE,參見
下面的解釋,請注意第一個參數後面,沒有逗號(,):
print(FILEHANDLE "your","list","here");
12.Perl的哲學
Perl 碰巧是由一個語言學家設計的(可以這麼說吧),因此它被設計成一個可以象自然語言那樣使用的程式設計語言。
Perl 被設計成可以進化,並且實際上也已經進化了。駱駝(Perl的徽標)是一匹委員會設計的馬,但是被放到了沙漠中。沙漠中,駱駝是非常適應沙漠中的生活。馬已經進化成為相當能自給自足的駱駝了,這也是選擇駱駝作為 Perl 的吉祥物眾多原因中的一個,而和語言學沒有什麼關係。我覺得和生物進化學倒是相關。
環境在 Perl 中是十分重要的,Perl 將根據環境來判斷你想要什麼,而不用象其他程式設計語言一樣必須明確地告訴它.
數組和散列的最簡單的應用哲學:當你想通過編號來尋找東西的時候,你要用數組.而如果你想通過名稱來尋找東西,那麼你應該用散列.這兩種概念是互補的.
散列使用 % 這個趣味字元來標誌散列名字(如果你仔細觀察 %,你會發現斜扛兩邊的鍵字和數值.)
13.使用了尚未賦值的變數
這個未初始化的變數會在需要的時候自動存在.遵循最小意外的原則,該變數按照常規初始化為空白值,"" 或 0.根據使用的地方的不同,變數會被自動解釋成字串,數字或"真"和"假"(通常稱布爾值).
14.標量的環境
在 Perl 中不同的操作符會要求特定類型的單數值作為參數.這個操作符就給這些參數提供了一個標量的環境.有時還會更明確,比如說操作符會給這些參數提供一個數字環境,字串環境或布爾環境.Perl 會根據環境自動將資料轉換成正確的形式.
例如:
$camels = '123';
print $camels +1, "/n";
124
15.列表操作
列表賦值: ($potato, $lift, $tennis, $pipe) = @home;
他們邏輯上平行發生,因此你可以象下面一樣交換兩個變數: ($alpha, $omega) = ( $omega, $alpha);
作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/