Perl語言入門(13 perl除錯程式)
由於公司需要,本人最近在學習Perl這種指令碼語言,本文是我在學習Perl的過程中總結出來的一些心得和筆記,希望能夠幫助也在學習Perl的各位同僚。廢話不多說直接上乾貨!!!
———————————————————————————乾貨分割線 —————————————————————————
1.什麼是除錯程式
P e r l除錯程式是個P e r l解釋程式的內建特性。它使你能夠取出任何一個P e r l程式,然後逐個語句執行該程式。在執行過程中,你可以檢視各個變數,修改這些變數,讓程式執行較長
的時間,中斷程式的執行,或者從頭開始執行該程式。
2.啟動除錯程式
若要啟動P e r l除錯程式,必須開啟作業系統的命令提示符。若你是D O S和Wi n d o w s使用者,那麼要開啟M S - D O S的標準提示符C : \。如果是U N I X使用者,這個提示符應該是你登入時顯示的提示符(通常是%或$)。PS:本例中使用D O S提示符,以perl9中的程式為例(可檢視部落格perl9的內容)
啟動除錯程式:
perl -d Employee.pl
輸出該命令後,會顯示版本資訊:
該除錯程式首先顯示版本號和help 提示。接著顯示該程式的第一行可執行程式碼。由於第一個語句實際上包含7行,從“my @employees=(”開始,以“);”為結尾,因此所有7行語句均顯示一個描述,以說明它們來自什麼檔案,以及它們是在檔案的哪一行或哪幾行上找到的(第5至第11行)。
最後,你看到除錯檔案的提示符D B < 1 >。1表示除錯檔案正在等待它的第一個命令。除錯程式提示符後面的游標正等待你輸入命令。這時,你的P e r l程式實際上暫停在第一個指令-my @employees=(的前面。每當除錯程式向你顯示程式中的一個語句時,它就是準備要執行的語句,而不是上一個執行的語句。現在除錯程式已經作好準備,等待你輸入命令。
3.除錯程式的基本命令
1>.h:幫助命令,所有可用命令均被輸出.
2>.h h:幫助命令的變形版本,可以輸出命令和語句的彙總.
3>.h cmd:輸出某個命令的幫助資訊.
4>.|:每次顯示一螢幕命令.如:檢視一螢幕幫助可用:|h.
5>.n:執行perl程式的下一個語句
當你鍵入命令n後,perll就執行Employee程式的第5至11行語句。然後除錯程式輸出要執行的下一個語句(但尚未執行) m y ( $ L 1,$ F 1 ) = s p l i t(’,’,$ a);並顯示另一個提示符。
當程式執行到這個時候, @ e m p l o y e e s被初始化為5個名字和工資等。若要檢視這些資訊,可以將它們輸出:
print @employees [原始版]
顯示:
也可以更清楚的顯示輸出資訊,鍵入:
Print join(“\n”,@employees) [升級版]
顯示:
4.斷點
如果不是每次執行一個指令,你可以讓除錯程式連續執行你的P e r l程式,直到到達某個語句,然後停止執行。這些停止執行的位置稱為斷點。
若要設定斷點,請使用b breakpoint命令,其中breakpoint可以是行號或子例程名。若要在第3 3行上設定斷點,可以輸入下面這個命令:
b 33
你可以使用l命令來瀏覽程式行,看看哪行適合新增斷點(斷點不能設定在花括號、標點符號、空行或只包含註釋的程式碼行上)。命令l用於列出程式的下面1 0行。再次鍵l,可以列出下面的1 0行,如此類推。若要列出從某一行開始的程式,請鍵入l lineno,其中lineno是程式的行號。也可以設定要列出的行的範圍,方法是鍵入命令l start-end。
鍵入:l
顯示:
PS:,標號= = = >用於指明除錯程式準備執行的當前行.
命令c:。命令c向除錯程式發出指令,使P e r l程式執行到下一個斷點或程式的結尾:
顯示:
命令d:若要撤消程式中的斷點,可以採用命令d,比如d line 或d submane.
命令R:重新啟動你的程式,該命令使perl程式回到它的開始處.
命令s:單步進入設定斷點的程式行中.s命令的作用是執行函式,然後在函式中的第1個指令處停止執行.
還可以在P e r l程式執行時修改程式裡的變數。例如,若要給員工每小時臨時增加2 . 5 0美元
的工資,可以輸入下面的程式碼:
print $hourly
$hourly = $hourly + 2.50,如下:
命令q:退出除錯程式
5.單命令列程式
這種程式的關鍵是在命令列上賦予P e r l的- e開關。- e的後面可以是任何P e r l語句,如:
Perl -e “print ‘hello,world’;”
顯示:
插入多個語句:
perl -e "print 'hello,world';" -e "print'howzit goin?'"
顯示:
-c:P e r l解釋程式中的- c開關可供P e r l用來檢視你的程式碼,以便找出語句上的問題,但是它實
際上並不執行程式,當程式正確時,顯示:
當程式錯誤時,報錯,顯示:
6.<>與更多單命令列程式
迄今為止介紹的尖括號運算子( < >)具有兩個功能:
1) 如果尖括號中間是檔案控制代碼,尖括號運算子允許你讀取檔案控制代碼,比如< S T D I N >。
2) 如果尖括號中間是搜尋模式,尖括號運算子能返回與該模式匹配的檔案列表,這稱為一個glob,比如< * . b a t >。
尖括號運算子還有另一個功能。一組尖括號運算子如果中間沒有任何東西,那麼它可以讀取命令列上所有檔案的內容;如果沒有給出檔名,則可以讀取標準輸出。
Exp:
#!/usr/bin/perl -w
use strict;
use warnings;
while(<>){
print $_;
}
如果將上面的程式儲存為E x a m p l e . p l,那麼用下面這個命令列執行該程式:
perl -w Example.pl file1 file2 file3
就可使運算子< >讀取f i l e 1的內容,每次讀1行,然後讀取f i l e 2,接著讀取f i l e 3。
Perl程式的- n開關可用於將任何- e語句封裝在該小程式中:
LINE:
While(<>){
... #Your -e statements here.
}
因此,若要建立一個簡短的單命令列程式,從輸入資料中刪除前導空格,你可以編寫下面的命令:
Perl -n -e ‘s/^\s+//g;print $_;’ file1
上面這個命令實際上執行類似下面這個P e r l程式:
LINE:
While(<>){
s/^\s+//g;
print $_;
}
在上面這個程式碼段中,名字為f i l e 1的檔案被開啟,並被賦予w h i l e迴圈中的$_,每次1行。該行用S / ^ \ S + / / g進行編輯,然後進行輸出。- p與- n開關的作用相同,差別在於語句執行後各個檔案行便自動輸出。因此,重新編寫上面這個命令列便產生下面這個命令列:
perl -p -e ’s/^\s+//g’ file1
當你用P e r l的單命令列程式來編輯一個檔案時,必須注意不要在開啟檔案進行讀取操作的同時,又試圖對它進行寫入操作,像下面這個例子那樣:
perl -p -e ‘s/\r//g’ dosfile > dosfile
上面這個程式碼段試圖從稱為dosfile的檔案中刪除回車符。問題是在P e r l命令被處理之前,dosfile檔案已經被>dosfile改寫。編輯檔案的正確方法應該是將輸入重定向到另一個檔案中,並將檔案改為它的原始名字,如下所示:
perl -p -e ‘s/\r//g’dosfile > tempfile
rename tempfile dosfile
7.使用引用除錯程式:
若你的程式中有引用,你可以輸出該引用,perl能夠顯示該引用指向什麼結構,如:
print $mystery_ref;
顯示:ARRAY(0X1231920)
這意味著$mystery_ref;是對一個數組的引用.此外,變數也可以是對標量(SCALAR)、雜湊結構(HASH)或子例程(CODE)的引用.若要輸出$mystery_ref指向的陣列,可以將它作為陣列來處理,如下所示:
print join(‘,’,@{$mystery_ref});
當你在程式的除錯視窗中輸入除錯命令:print $ref ,它若顯示HASH(0X20222dac),顯然,$ref是指一個雜湊結構.然後輸入命令:x $ref,
會顯示:
在這個程式碼中,該引用包含一個帶有兩個元素(關鍵字‘ f r u i t’和‘ v e g e t a b l e’)的雜湊
結構。該除錯程式甚至能夠輸出列表的列表之類的複雜資料結構,如下所示:
上面的例子顯示了一個引用$ a,它指向一個數組ARRAY(0x20170bd4)。而這個陣列又包含3個別的資料引用,即ARRAY(0x20115484)、ARRAY(0x2011fbb4)和ARRAY(0x2011faa0),每個陣列包含3個元素。