Perl 包和模塊
Perl 中每個(gè)包有一個(gè)單獨(dú)的符號(hào)表,定義語法為:
package mypack;
此語句定義一個(gè)名為 mypack 的包,在此后定義的所有變量和子程序的名字都存貯在該包關(guān)聯(lián)的符號(hào)表中,直到遇到另一個(gè) package 語句為止。
每個(gè)符號(hào)表有其自己的一組變量、子程序名,各組名字是不相關(guān)的,因此可以在不同的包中使用相同的變量名,而代表的是不同的變量。
從一個(gè)包中訪問另外一個(gè)包的變量,可通過" 包名 + 雙冒號(hào)( :: ) + 變量名 " 的方式指定。
存貯變量和子程序的名字的默認(rèn)符號(hào)表是與名為 main的包相關(guān)聯(lián)的。如果在程序里定義了其它的包,當(dāng)你想切換回去使用默認(rèn)的符號(hào)表,可以重新指定main包:package main;
這樣,接下來的程序就好象從沒定義過包一樣,變量和子程序的名字象通常那樣存貯。
以下實(shí)例中文件有 main 和 Foo 包。 特殊變量 __PACKAGE__ 用于輸出包名:
#!/usr/bin/perl # main 包 $i = 1; print "包名 : " , __PACKAGE__ , " $i\n"; package Foo; # Foo 包 $i = 10; print "包名 : " , __PACKAGE__ , " $i\n"; package main; # 重新指定 main 包 $i = 100; print "包名 : " , __PACKAGE__ , " $i\n"; print "包名: " , __PACKAGE__ , " $Foo::i\n"; 1;
執(zhí)行以上程序,輸出結(jié)果為:
包名 : main 1 包名 : Foo 10 包名 : main 100 包名: main 10
BEGIN 和 END 模塊
Perl語言提供了兩個(gè)關(guān)鍵字:BEGIN,END。它們可以分別包含一組腳本,用于程序體運(yùn)行前或者運(yùn)行后的執(zhí)行。
語法格式如下:
BEGIN { ... } END { ... } BEGIN { ... } END { ... }
每個(gè) BEGIN 模塊在 Perl 腳本載入和編譯后但在其他語句執(zhí)行前執(zhí)行。
每個(gè) END 語句塊在解釋器退出前執(zhí)行。
BEGIN 和 END 語句塊在創(chuàng)建 Perl 模塊時(shí)特別有用。
如果你還不大理解,我們可以看個(gè)實(shí)例:
#!/usr/bin/perl package Foo; print "Begin 和 Block 實(shí)例\n"; BEGIN { print "這是 BEGIN 語句塊\n" } END { print "這是 END 語句塊\n" } 1;
執(zhí)行以上程序,輸出結(jié)果為:
這是 BEGIN 語句塊 Begin 和 Block 實(shí)例 這是 END 語句塊
什么是 Perl 模塊?
Perl5 中用Perl包來創(chuàng)建模塊。
Perl 模塊是一個(gè)可重復(fù)使用的包,模塊的名字與包名相同,定義的文件后綴為 .pm。
以下我們定義了一個(gè)模塊 Foo.pm,代碼如下所示:
#!/usr/bin/perl package Foo; sub bar { print "Hello $_[0]\n" } sub blat { print "World $_[0]\n" } 1;
Perl 中關(guān)于模塊需要注意以下幾點(diǎn):
函數(shù) require 和 use 將載入一個(gè)模塊。
@INC 是 Perl 內(nèi)置的一個(gè)特殊數(shù)組,它包含指向庫例程所在位置的目錄路徑。
require 和 use 函數(shù)調(diào)用 eval 函數(shù)來執(zhí)行代碼。
末尾 1; 執(zhí)行返回 TRUE,這是必須的,否則返回錯(cuò)誤。
Require 和 Use 函數(shù)
模塊可以通過 require 函數(shù)來調(diào)用,如下所示:
#!/usr/bin/perl require Foo; Foo::bar( "a" ); Foo::blat( "b" );
也可以通過 use 函數(shù)來引用:
<pre> #!/usr/bin/perl use Foo; bar( "a" ); blat( "b" );
我們注意到 require 引用需要使用包名指定函數(shù),而 use 不需要,二者的主要區(qū)別在于:
- 1、require用于載入module或perl程序(.pm后綴可以省略,但.pl必須有)
- 2、Perl use語句是編譯時(shí)引入的,require是運(yùn)行時(shí)引入的
- 3、Perl use引入模塊的同時(shí),也引入了模塊的子模塊。而require則不能引入,要在重新聲明
- 4、USE是在當(dāng)前默認(rèn)的@INC里面去尋找,一旦模塊不在@INC中的話,用USE是不可以引入的,但是require可以指定路徑
- 5、USE引用模塊時(shí),如果模塊名稱中包含::雙冒號(hào),該雙冒號(hào)將作為路徑分隔符,相當(dāng)于Unix下的/或者Windows下的\。 如:
use MyDirectory::MyModule
通過添加以下語句 use 模塊就可以從模塊中導(dǎo)出列表符號(hào):
require Exporter; @ISA = qw(Exporter);
@EXPORT數(shù)組包含默認(rèn)導(dǎo)出的變量和函數(shù)的名字:
package Module; require Exporter; @ISA = qw(Exporter); @EXPORT = qw(bar blat); # 默認(rèn)導(dǎo)出的符號(hào) sub bar { print "Hello $_[0]\n" } sub blat { print "World $_[0]\n" } sub splat { print "Not $_[0]\n" } # Not exported! 1;
創(chuàng)建 Perl 模塊
通過 Perl 分發(fā)自帶的工具 h2xs 可以很簡單的創(chuàng)建一個(gè) Perl 模塊。
你可以在命令行模式鍵入 h2xs 來看看它的參數(shù)列表。
h2xs 語法格式:
$ h2xs -AX -n ModuleName
參數(shù)說明:
-A 忽略 autoload 機(jī)制
-X 忽略 XS 元素
-n 指定擴(kuò)展模塊的名字
例如,如果你的模塊在 Person.pm 文件中,使用以下命令:
$ h2xs -AX -n Person
執(zhí)行以上程序?qū)⑤敵觯?/p>
Writing Person/lib/Person.pm Writing Person/Makefile.PL Writing Person/README Writing Person/t/Person.t Writing Person/Changes Writing Person/MANIFEST
Person 目錄下你可以看到新增加的目錄及文件說明:
README :這個(gè)文件包含一些安裝信息,模塊依賴性,版權(quán)信息等。
Changes :這個(gè)文件作為你的項(xiàng)目的修改日志(changelog)文件。
Makefile.PL :這是標(biāo)準(zhǔn)的 Perl Makefile 構(gòu)造器。用于創(chuàng)建 Makefile.PL 文件來編譯該模塊。
MANIFEST :本文件用于自動(dòng)構(gòu)建 tar.gz 類型的模塊版本分發(fā)。這樣你就可以把你的模塊拿到 CPAN 發(fā)布或者分發(fā)給其他人。它包含了你在這個(gè)項(xiàng)目中所有文件的列表。
Person.pm :這是主模塊文件,包含你的 mod_perl 句柄代碼(handler code)。
Person.t :針對(duì)該模塊的一些測(cè)試腳本。默認(rèn)情況下它只是檢查模塊的載入,你可以添加一些新的測(cè)試單元。
t/ :測(cè)試文件
lib/ :實(shí)際源碼存放的目錄
你可以使用 tar (Linux 上) 命令來將以上目錄打包為 Person.tar.gz。
安裝 Perl 模塊
我們可以對(duì)剛才壓縮的 Person.tar.gz 文件進(jìn)行解壓安裝,執(zhí)行步驟如下:
tar xvfz Person.tar.gz cd Person perl Makefile.PL make make install
首先運(yùn)行 "perl Makefile.PL" 在當(dāng)前目錄生成 Makefile;
然后運(yùn)行 "make" 編譯并創(chuàng)建所需的庫文件;
之后用 "make test" 測(cè)試編譯結(jié)果是否正確;最后運(yùn)行 "make install" 將庫文件安裝到系統(tǒng)目錄,至此整個(gè)編譯過程結(jié)束。
更多建議: