1. 程式人生 > >Perl語言入門(13 perl除錯程式)

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//gdosfile > 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個元素。