Perl的編譯學習小結

2021-07-04 02:46:57 字數 1072 閱讀 4789

看前輩們寫的測試工具,前後總是有begin 和 end 兩個模組,而且在常用的perl -d debug這些perl指令碼的時候,這個begin和end卻沒有看到執行過程。今天看了perl 大駱駝書的編譯和命令列介面 了解了。

perl 的生命週期可以分為,編譯 (**生成 解析樹重構階段) 和執行 四個階段組成。

1.在編譯階段 perl能夠根據begin 引導塊進行的更加深入。 begin 塊一完成解析就交給直譯器以fifo的順序進行執行。這樣處理的還有use和no 宣告,use和no 實際上試偽裝的begin塊。任何check init 和end塊都由編譯器安排延遲執行。

init 以fifo

check和end以lifo的順興執行。

2.**生成階段(可選) 這個時候是把編譯完成的程式轉換成c源程式或者序列的perl 位元組碼(乙個代表內部的perl指令的值序列)

這個時候完成chcek塊的工作。

3. 解析樹重構階段(可選)

要復活程式,必須重構解析樹。這個階段是發生了**生成階段並且生成了位元組碼的情況下 存在的。 perl必須從位元組碼重構解析樹 才能執行。

4. 執行階段。

解析器 拿來解析樹(可能直接從編譯階段得到 或者間接從**生成階段或者衝解析樹重構階段得到) 並且執行。

這個階段開始之前,在主程式執行之前,所有安排好的init會以fifo的順序執行。

當程式執行後。 會以lifo的順序執行end塊。

再說一下begin end init 和check 多次定義這些塊不會有任何問題,因為perl會跟蹤何時呼叫他們,並且不用通過名字呼叫。

begin  --- 如果在編譯過程中碰到 則在編譯檔案的其他部分之前盡可能快的執行  fifo

check   --- 編譯完成之後,程式開始之前。  lifo

init  ----        主流程開始之前  fifo

end 程式執行之後  lifo   end塊會盡可能晚的執行,當程式退出perl直譯器,甚至因為乙個沒有捕獲的die或者其他異常。在兩種情況下會忽略end塊(或者destory)   a y乙個程式不是退出 而是以exec從乙個程式變形到另外乙個程式 或者乙個程序被未捕獲的訊號殺死時。

perl學習筆記 解引用小結

目前正在自學perl,看到關於dereference的一些寫法 array1 qw a b c array2 qw d e f array array ref array 假如要訪問array1中的第2個元素,可以有如下幾種寫法 array 0 1 寫法一 0 1 寫法二 array ref 0 1...

perl使用小結

快捷鍵markdown及擴充套件 離線寫部落格 瀏覽器相容 安裝方式a perl makefile.pl make make test make installperldoc model name 檢視指定模組的資訊,檢查乙個模組是否已安裝只需該看看模組文件存在與否 sudo perl mcpan ...

perl 使用小結

環境設定 如果有系統字元編碼 衝突,在當前 vim bash profile 下加入 lang zh cn lc all zh cn utf8 export lang lc all 字元編碼轉化 由decode解析,缺省會使用 系統編碼 輸出 在 linux 下面其實等價 encode utf 8 ...