Perl脚本编程
Perl腳本學習筆記
文章目錄
- Perl腳本學習筆記
- 一、編寫你的第一個Perl程序
- 二、Perl的基本構件
- 1.直接量
- 2.標量變量
- 3.表達式和運算符
- 三、控制程序流
- 1.if 語句
- 2.while 循環
- 3.for 循環
- 四、列表與數組
- 1.列表
- 2.數組
- 3.遍歷數組
- 4.數組排序
- 五、文件操作
- 1.打開文件
- 2.讀取文件
- 3.寫入文件
- 六、模式匹配
- 1.元字符
- 2.字符類
- 3.分組和選擇
- 4.位置通配符
- 5.替換
- 6.連接運算符
- 7.grep函數
- 七、哈希結構
- 1.將數據填入哈希結構
- 2.從哈希結構中取出數據
- 3.列表與哈希結構
- 4.關于哈希結構的補充說明
- 八、函數
- 1.子例程
- 2.參數
- 3.作用域
- 總結
一、編寫你的第一個Perl程序
#!/usr/bin/perl -w #-w 可以報錯 print "Hello, World!\n";常用的擴展名是.pl或.plx,運行hello.pl,執行perl hello.pl
二、Perl的基本構件
1.直接量
Perl擁有兩種不同類型的標量常量,它們都稱為直接量。一種是數字直接量,一種是字符串直接量。
數字直接量都是一些數字,Perl可以接受若干種不同的數字寫法。
給字符串加引號有兩種主要方法,一種是使用單引號(’ '),一種是使用雙引號(" ")。
差別是使用單引號的字符串含義是非常直觀的,單引號字符串中的每個字符就是表示它自己的含義。在雙引號中的字符串中,Perl要查看是否存在變量名或轉義字符。
perl還提供了另一個引號機制,即qq和q運算符分別代替雙引號和單引號。
2.標量變量
若要將標量數據存放在Perl中,必須使用標量變量。在 Perl中,如果要寫一個標量變量,可以寫一個美元符號,后跟變量的名字。
$a
3.表達式和運算符
字符串運算符
并置運算符用圓點來表示(.)
執行結果:
重復運算符x
運算符x配有兩個參數,一個是要重復的字符串,另一個是該字符串重復的次數。
執行結果:
單參數運算符
遞增和遞減
尖括號運算符
尖括號運算符(<>),也稱菱形運算符,主要用于讀寫文件。
< STDIN >表達式返回從鍵盤讀取的這行信息
< STDIN>表達式從鍵盤讀取信息,直到用戶按下 E n t e r鍵為止。整個輸入行返回,并被存放在$size中。由< STDIN >返回的文本行也包含用戶鍵入的換行符(因為按下了 Enter鍵) 。在大多數情況下,你不希望在字符串的結尾處出現換行符。若要刪除換行符,可以像下面這樣
使用chomp運算符:
數字關系運算符
字母關系運算符
邏輯運算符
文件測試運算符
三、控制程序流
1.if 語句
單if語句
適用范圍:只需要一步判斷,條件返回真干什么或者條件返回假干什么
if-else 語句
適用范圍:兩步判斷,條件為真干什么,條件為假干什么
多重判斷
if (condition1) {commands1; } elsif (condition2) {commands2; } else {commands3; }2.while 循環
只要表達式是真的,while循環就會重復執行該代碼段
while (condition) {commands; }3.for 循環
for (變量;條件;自增自減運算) {commands; }明細控制
除了使用語句塊、for、while 、if以及其他流控制語句來控制代碼塊以外,還可以使用Perl語句來控制語句塊中的流程。
last語句能夠使當前正在運行的最里面的循環塊退出。
執行結果:
last 語句能夠在$i的值是5時使while循環退出,而不是在通常 while測試的結果是假時退出。當你擁有多個嵌套的循環語句時, last 將退出當前正在運行的循環。
next****語句使得控制權被重新傳遞給循環的頂部
執行結果:
該循環將輸出從 0到98之間的所有奇數。如果 $ i是偶數,那么 next語句將使該循環通過它的下一個迭代運行過程。
標號
Perl允許你給語句塊和某些循環語句( for、while)加上標號。也就是說,可以在語句塊或語句的前面放置一個標識符:
last、redo和next語句都可以帶有一個標號,作為參數,這樣就可以退出一個特殊的語句塊。
exit語句是最后的一個流控制工具。當perl遇到exit語句時,程序就停止執行,perl將一個退出狀態返回給操作系統。
四、列表與數組
1.列表
列表的語法是用一組括號將一些標量值括起來
(5, 'appel', $x, 3.14);qw運算符,列表每個元素用白空間隔開
qw (5 apple $x 3.14);范圍運算符由一對圓點來表示
#1~10之間的數列 (1..10);2.數組
#!/usr/bin/perl -w #-w 可以報錯 @boy=qw(Greg Peter Bobby); @girl=qw(Marcia Jan Cindy); @kids=(@girl, @boy); print "@kids\n";執行結果:
從數組中取出元素
3.遍歷數組
#!/usr/bin/perl -w @boy=qw(Greg Peter Bobby); for($index=0;$index<@boy;$index++){ print "My favorite is $boy[$index]\n" } #!/usr/bin/perl -w @boy=qw(Greg Peter Bobby); foreach $b (@boy){print "My favorite is $b\n" }執行結果:
將標量轉換成數組的方法之一是使用split函數。
Split函數擁有一個模式和一個標量,并且使用該模式來分割該標量
執行結果:
將數組轉換成標量使用join函數
$number=join(',',(1..10));執行結果:
4.數組排序
sort函數將一個列表作為它的參數,并且大體上按照字母順序對列表進行排序,然后該函數返回一個排定順序的新列表。
#!/usr/bin/perl -w @boy=qw(Greg Peter Bobby); print join(' ',sort @boy);執行結果:
reverse函數能夠對字符串的字符進行倒序操作,返回倒序后的字符串。
執行結果
五、文件操作
1.打開文件
open函數用于打開文件,句法如下:
open(filehandle,pathname) || dieopen函數將文件句柄作為它的第一個參數,將路徑名作為第二個參數。路徑名用于指明要打開哪個文件。
這一行代碼可以讀作“打開或撤消”,它有時表示你想要讓程序如何處理沒有打開的文件。如果 open運行沒有成功,也就是說它返回 FALSE,那么邏輯 OR(||)必須計算右邊的參數(die);如果open運行成功了,也就是說它返回TRUE,那么就不要計算die的值。
close 函數關閉句柄
當完成文件句柄的操作后,將文件句柄關閉,這是個很好的編程習慣。
打開file.txt文件,當試圖打開沒有設定目錄名的文件名時,Perl假定該文件是在當前目錄中。若要打開位于另一個目錄中的文件,必須使用路徑名。
特殊變量 $! ,在字符串上下文中,返回來自你的操作系統的相應出錯消息。
#!/usr/bin/perl -w open(MYFILE, "/home/liuye/Scripts/perl/file1.txt") || die "$!"; close (MYFILE)執行結果:
2.讀取文件
使用文件輸入符 < >
若要讀取文件句柄,只需要將文件句柄放入尖括號運算符中,將該值賦予一個變量。
3.寫入文件
open(filehandle,">pathname") //改寫 open(filehandle,">>pathname") //追加寫入操作
print filehandel LISTfilehandel是要將數據寫入到的文件句柄, LIST是要寫入的數據的列表
#!/usr/bin/perl -w open(MYFILE, ">>/home/liuye/Scripts/perl/file.txt") || die "$!"; @contents=qw(this is a cat); print MYFILE @contents; close (MYFILE);六、模式匹配
簡單的模式匹配運算符m/ /
1.元字符
. 圓點用于匹配除了換行符外的任何單個字符 \ 在字符前面加上一個反斜杠,使它失去“元”的含義 + 用于使前面的字符與后面的字符至少匹配一次 * 前面的字符可以進行 0次或多次匹配 ? 用于使前面的字符進行 0次或一次匹配 .* 用來匹配任何東西 {n,m} 根據需要的具體次數進行匹配,n是匹配的最小次數,m是匹配的最大次數/x{5,10}/ x至少出現5次,但是不超過1 0次 /x{9, }/ x至少出現9次,也可能出現更多次 /x{0,4}/ x最多出現4次,也可能根本不出現 /x{8}/ x必須正好出現8次2.字符類
若要編寫一個字符類,可以用方括號[ ]將這些字符括起來,在字符類中,大多數通配符會失去它們的“通配符性質”,因此,* 實際上代表一個普通的字符。
如果插入記號( ^)作為字符類中的第一個字符,該字符類將變為無效
3.分組和選擇
當可能的匹配項之間用一個 | 字符隔開時,正則表達式中就出現了選擇
#這個字符串包含dogs還是cats if (/dogs|cats/) { print "\$_ contains a pet\n"; } 可以對括號進行嵌套,使一個組中包含另一個組 /(fl|b|fl|cl)og/4.位置通配符
第一個位置通配符是插入記號( ^)
與它相對應的通配符是美元符號( $)
5.替換
替換運算符 s / / /
s/search/replace/6.連接運算符
連接運算符 = ~
如果要對非 $ _的變量使用匹配運算符和替換運算符,則必須將它們與該變量連接起來
7.grep函數
grep搜索數組,尋找某些模式
grep不一定必須與模式匹配或替換運算符一道使用,它可以與任何運算符一道使用,下面這個例子用于檢索長度超過 8個字符的犬名
執行結果:
七、哈希結構
哈希是Perl中的第三種基本數據類型。與數組一樣,哈希包含了許多個標量。數組與哈希的差別是:哈希是按照名字來訪問它們的標量的,而不是像數組那樣使用數字標號進行訪問。
哈希元素包含兩個部分,即一個關鍵字和一個值。關鍵字用于標識哈希的每個元素,而值則是與該關鍵字相關的數據。這種關系稱為關鍵字值對
1.將數據填入哈希結構
哈希變量是以百分比符號(%)來標識的。
若要創建哈希元素,只需要將值賦予這些元素即可,這與創建數組的元素很相似。
P e r l有一個特殊的運算符,稱為逗號箭頭運算符,即 =>。使用=>運算符,同時利用Perl忽略白空間的特性,就能夠編寫下面這樣的哈希結構的初始化代碼。
%food=(key1 => 'value1',key2 => 'value2');2.從哈希結構中取出數據
key函數來檢索作為列表返回的哈希結構的所有關鍵字。
若要輸出該哈希結構中的所有電影名字,可以使用下面的代碼:
values函數來檢索哈希結構中存放的所有值。
foreach $film (values %Movies){print "$film\n"; } @Directors=values %Moves; @Films=keys %Moves;3.列表與哈希結構
若要拷貝一個哈希結構,只需要像下面這樣將這個哈希結構賦予另一個哈希結構即可:
%New_Hash=%Old_Hash;當你將 % Old_Hash置于哈希初始化代碼的右邊時( Perl通常希望右邊是個列表或數組),Perl便將哈希結構轉換成一個列表。可以像處理列表那樣,將幾個哈希結構組合起來并對它進行操作。
%Both=(%First,%Second); %Additional=(%Both,key1 => 'value1',key2 => 'value2' );4.關于哈希結構的補充說明
exists函數可以用于測試哈希結構中是否存在哈希關鍵字,如果存在,便返回真,否則返回假。
if (exists $Hash{keyval}) {: }delete函數刪除單個哈希關鍵字。
delete $Hash{keyval};若要從哈希結構中刪除所有關鍵字和值,只需要將哈希結構初始化為一個空的列表即可。
%Hash=();八、函數
在 Perl中,用戶定義的函數稱為子例程。與 Perl的內置函數一樣,用戶定義的函數也可以擁有參數,并且可以將值返回給調用者
1.子例程
sub function_name {statement; } #調用子例程 &function (); 或 function ();子例程的返回值是子例程中計算的最后一個表達式的值,或者是return語句顯式返回的值。
2.參數
若要傳遞子例程的參數,可以使用下面任何一個語句。
subname (arg1, arg2, arg3); &subname (arg1, arg2, arg3); subname arg1, arg2, arg3;只有當Perl已經遇到子例程的定義時,才能使用上面不帶括號的第三種參數形式。
在子例程中,被傳遞的參數可以通過Perl的特殊變量 @_ 來訪問。
若要像下面這個例子中那樣,訪問傳遞過來的各個參數,可以使用數組 @ _上的下標。 $ _ [0] (@_的一個下標)與標量 $ _毫不相干:
sub print_third_argument {print $_[2];//取第三個參數 }3.作用域
my操作符,使變量成為函數的專用變量。
sub moonweight {my $weight;($weight)=@_;return ($weight/1.66667); }Perl語句use strict,它能夠激活更嚴格的 Perl,使你能夠避免在編程中出現錯誤。
總結
參考文獻:Perl編程24學時教程
總結
- 上一篇: NMEA0183协议中的GGA语句解析
- 下一篇: nekohtml的简单使用