- Perl 基礎
- Perl - 首頁
- Perl - 簡介
- Perl - 環境
- Perl - 語法概述
- Perl - 資料型別
- Perl - 變數
- Perl - 標量
- Perl - 陣列
- Perl - 雜湊
- Perl - IF...ELSE
- Perl - 迴圈
- Perl - 運算子
- Perl - 日期和時間
- Perl - 子程式
- Perl - 引用
- Perl - 格式
- Perl - 檔案 I/O
- Perl - 目錄
- Perl - 錯誤處理
- Perl - 特殊變數
- Perl - 編碼規範
- Perl - 正則表示式
- Perl - 傳送郵件
- Perl 高階
- Perl - 套接字程式設計
- Perl - 面向物件
- Perl - 資料庫訪問
- Perl - CGI 程式設計
- Perl - 包和模組
- Perl - 程序管理
- Perl - 嵌入式文件
- Perl - 函式引用
- Perl 有用資源
- Perl - 問題和解答
- Perl - 快速指南
- Perl - 有用資源
- Perl - 討論
Perl - 包和模組
什麼是包?
package 語句將當前命名上下文切換到指定的名稱空間(符號表)。因此 -
包是存在於其自身名稱空間中的一組程式碼。
名稱空間是唯一變數名稱的命名集合(也稱為符號表)。
名稱空間防止包之間發生變數名稱衝突。
包允許構建模組,這些模組在使用時不會覆蓋模組自身名稱空間之外的變數和函式。
包一直有效,直到呼叫另一個 package 語句,或者直到當前塊或檔案的末尾。
您可以使用 :: 包限定符顯式引用包內的變數。
以下是一個在檔案中包含 main 和 Foo 包的示例。此處使用了特殊變數 __PACKAGE__ 來列印包名稱。
#!/usr/bin/perl # This is main package $i = 1; print "Package name : " , __PACKAGE__ , " $i\n"; package Foo; # This is Foo package $i = 10; print "Package name : " , __PACKAGE__ , " $i\n"; package main; # This is again main package $i = 100; print "Package name : " , __PACKAGE__ , " $i\n"; print "Package name : " , __PACKAGE__ , " $Foo::i\n"; 1;
當執行以上程式碼時,它會產生以下結果 -
Package name : main 1 Package name : Foo 10 Package name : main 100 Package name : main 10
BEGIN 和 END 塊
您可以定義任意數量名為 BEGIN 和 END 的程式碼塊,它們分別充當建構函式和解構函式。
BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
每個 BEGIN 塊在 Perl 指令碼載入和編譯後但在執行任何其他語句之前執行。
每個 END 塊在 Perl 直譯器退出之前執行。
BEGIN 和 END 塊在建立 Perl 模組時特別有用。
以下示例顯示了其用法 -
#!/usr/bin/perl
package Foo;
print "Begin and Block Demo\n";
BEGIN {
print "This is BEGIN Block\n"
}
END {
print "This is END Block\n"
}
1;
當執行以上程式碼時,它會產生以下結果 -
This is BEGIN Block Begin and Block Demo This is END Block
什麼是 Perl 模組?
Perl 模組是在庫檔案中定義的可重用包,其檔名與包名相同,副檔名為 .pm。
名為 Foo.pm 的 Perl 模組檔案可能包含如下語句。
#!/usr/bin/perl
package Foo;
sub bar {
print "Hello $_[0]\n"
}
sub blat {
print "World $_[0]\n"
}
1;
關於 Perl 模組的一些重要要點
函式 require 和 use 將載入模組。
兩者都使用 @INC 中的搜尋路徑列表來查詢模組。
這兩個函式 require 和 use 都呼叫 eval 函式來處理程式碼。
底部的 1; 使 eval 評估為 TRUE(因此不會失敗)。
Require 函式
可以透過如下呼叫 require 函式來載入模組 -
#!/usr/bin/perl require Foo; Foo::bar( "a" ); Foo::blat( "b" );
您可能已經注意到,必須使用完全限定的名稱來呼叫子程式。最好能夠將子程式 bar 和 blat 匯入到我們自己的名稱空間中,這樣我們就無需使用 Foo:: 限定符。
Use 函式
可以透過呼叫 use 函式來載入模組。
#!/usr/bin/perl use Foo; bar( "a" ); blat( "b" );
請注意,我們不必使用包的函式的完全限定名稱。use 函式將從模組中匯出符號列表,前提是在模組內部添加了一些語句。
require Exporter; @ISA = qw(Exporter);
然後,透過填充名為 @EXPORT 的列表變數來提供符號列表(標量、列表、雜湊、子程式等):例如 -
package Module;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);
sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" }
sub splat { print "Not $_[0]\n" } # Not exported!
1;
建立 Perl 模組樹
當您準備好釋出 Perl 模組時,有一種標準的建立 Perl 模組樹的方法。這是使用 h2xs 實用程式完成的。此實用程式與 Perl 一起提供。以下是使用 h2xs 的語法 -
$h2xs -AX -n ModuleName
例如,如果您的模組位於 Person.pm 檔案中,則只需發出以下命令 -
$h2xs -AX -n Person
這將產生以下結果 -
Writing Person/lib/Person.pm Writing Person/Makefile.PL Writing Person/README Writing Person/t/Person.t Writing Person/Changes Writing Person/MANIFEST
以下是這些選項的描述 -
-A 省略 Autoloader 程式碼(最適合定義大量不常用子程式的模組)。
-X 省略 XS 元素(外部子程式,其中外部表示 Perl 之外,即 C)。
-n 指定模組的名稱。
因此,以上命令在 Person 目錄中建立以下結構。上面顯示了實際結果。
- 更改
- Makefile.PL
- MANIFEST(包含包中所有檔案的列表)
- README
- t/(測試檔案)
- lib/(實際原始碼放在這裡)
所以最終,您將此目錄結構打包到檔案 Person.tar.gz 中,然後您可以釋出它。您將必須使用正確的說明更新 README 檔案。您還可以提供 t 目錄中的一些測試示例檔案。
安裝 Perl 模組
以 tar.gz 檔案形式下載 Perl 模組。使用以下序列安裝任何已下載為 Person.tar.gz 檔案的 Perl 模組 Person.pm。
tar xvfz Person.tar.gz cd Person perl Makefile.PL make make install
Perl 直譯器有一個目錄列表,它在其中搜索模組(全域性陣列 @INC)。