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 模組的一些重要要點

  • 函式 requireuse 將載入模組。

  • 兩者都使用 @INC 中的搜尋路徑列表來查詢模組。

  • 這兩個函式 requireuse 都呼叫 eval 函式來處理程式碼。

  • 底部的 1; 使 eval 評估為 TRUE(因此不會失敗)。

Require 函式

可以透過如下呼叫 require 函式來載入模組 -

#!/usr/bin/perl

require Foo;

Foo::bar( "a" );
Foo::blat( "b" );

您可能已經注意到,必須使用完全限定的名稱來呼叫子程式。最好能夠將子程式 barblat 匯入到我們自己的名稱空間中,這樣我們就無需使用 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)。

廣告

© . All rights reserved.