你是否覺得perl中關於模組的文件有些難懂?好的,這裡有乙個世界上最簡單的模組,它將用於展示(demonstrate)exporter模組所有的特性,另外還有一段使用這個模組的指令碼。同時,我們也會給出乙個有關於@inc的簡短說明,最後,還要講一下有些關於using warnings和use模組的使用。
下面是這個模組的內容:
mymodule.pm
package mymodule; use strict; use exporter; use vars qw($version @isa @export @export_ok %export_tags); $version = 1.00; @isa = qw(exporter); @export = (); @export_ok = qw(func1 func2); %export_tags = ( default => [qw(&func1)], both => [qw(&func1 &func2)]); sub func1 sub func2 @_ } 1;
首先,我們將通過宣告 "package" 名字來獲得乙個名字空間。這將確保模組中的方法與變數,和呼叫他們的**所分隔開來。
use strict在模組中是乙個非常好的做法,這將使perl對使用全域性變數做出一定的約束。
我們需要用exporter模組來將我們的函式從mymodule::namespace輸出到main::namespace,讓使用mymodule的程式可以使用這些函式。
為了use strict,我們必須使用use vars來宣告一些變數。當然,在5.6版本以上我們還可以使用our來宣告變數。
我們現在設定乙個$version數值,然後通過使用@isa來使得exporter成為mymodule的一部?。想要了解@isa是什麼以及如何使用等細節,請參考"perlboot"。
@export包含了我們需要預設輸出的函式列表。在這裡,它是空的。一般來說,你通過預設的使用@exprot輸出的越少越好。因為呼叫該模組的程式中,有可能存在與其中函式相之衝突的函式或者**。如果程式需要呼叫某個指定的函式,那麼,就請就讓它主動請求。
@export_ok包含了我們在呼叫時需要輸出的函式列表,我們只輸出了&func1和&func2,這種方法要優先於盲目地使用@export來輸出函式。你也可以輸出像$config這樣全域性的、不是用my定義的字義範疇的變數。(可參考用 "our" 或者 use vars來宣告全域性變數)
%export_tags.為了方便起見,我們定義了兩套輸出標籤。『:default』標籤只輸出&func1;『:both』標籤則輸出&func1和&func2。這個雜湊表儲存指向陣列引用的標籤。注意:在這裡的陣列是匿名的。
最後,我們需要在模組結尾加上乙個「1;」。因為當perl裝載乙個模組時,它會實現檢視這個模組是否能在最後返回乙個真值,並且據此判斷該模組是否已裝載成功。當然,你可以在最後面新增任何真值(參看 "code::police" ),但其中1是最方便的。
mysciprt.pl(使用mymodule的乙個例子)
#!/usr/bin/perl -w正如上面所見,我們在myscript.pl中使用了mymodule。把中間的注釋符號都去掉來看看會發生什麼。一次都去掉即可。use strict;
# you may need to set @inc here (see below)
my @list = qw (j u s t ~ a n o t h e r ~ p e r l ~ h a c k e r !);
# case 1
# use mymodule;
# print func1(@list),"\n";
# print func2(@list),"\n";
# case 2
# use mymodule qw(&func1);
# print func1(@list),"\n";
# print mymodule::func2(@list),"\n";
# case 3
# use mymodule qw(:default);
# print func1(@list),"\n";
# print func2(@list),"\n";
# case 4
# use mymodule qw(:both);
# print func1(@list),"\n";
# print func2(@list),"\n";
case 1: 因為我們的模組預設什麼都沒有輸出(沒有輸出&func1和&func2),所以我們會得到乙個他們在main:: namespace中不存在的錯誤。
case 2: 這個執行正常。我們讓模組輸出了&func1,於是我們可以正常使用它。儘管我們沒有輸出&func2,但是我們使用的是 &func2完整的包路徑,所以它也可以正常工作。
case 3: 『:default』標籤應該輸出&func1,所以你應該希望返回乙個缺少&func2函式的錯誤。但事實上perl卻偏偏找上了&func1的麻煩(錯誤資訊提示未定義&func1函式)。恩,這裡怎麼了呢?原來,default這個標籤名字是特殊的,在我們的模組中,%export_tags雜湊表它會被自動設定成這樣default=>\@exprot.也就是說,default預設匯出的是來自@exprot陣列的函式。
case 4: 我們指定通過『:both』標籤實現兩個函式都輸出,他實現了。 *關於@inc的注意事項* 當你提交乙個use mymodule的時候,就會指示perl去搜尋@inc陣列中是否有此模組名。@inc通常包含:
/perl/lib「.」這個目錄表示當前的工作目錄。核心模組是安裝在perl/lib目錄中,非核心模組安裝在perl/site/lib目錄中。你可以向@inc中新增自定義目錄。像下面這樣:/perl/site/lib
.
begin我們需要使用begin塊在編譯時向@inc中新增值,此時是perl檢查模組的時刻。# or
begin
# or
use lib 』/my/dir』;
如果你等到程式被編譯的時候就太晚了, perl會丟擲乙個異常,說「在@inc中無法找到mymodule」.使用push還是unshift方法新增值的區別是,perl搜尋@inc的順序是從@inc中的第乙個目錄開始的。如果你在/perl/lib/、/perl/site/lib/和./中都有乙個mymodule模組的話,那麼 /perl/lib中的模組將首先被找到並使用。use lib用法可以起到和begin一樣的效果-請參看"perlman:lib:lib": perlman%3alib%3alib . *use foo::bar意味著什麼* use foo::bar並不意味著在@inc的目錄中尋找乙個叫做foo::bar.pm的模組檔案。它的意思是在@inc的目錄中尋找乙個叫做『foo』的 「子目錄」,然後在其中找乙個叫做「bar.pm」的「模組」。現在,如果我們成功"use"了乙個模組,那麼我們就可以通過完整的包路徑語法&package::function使用這個模組中的所有函式。當我們說&foo::bar::some_func的時候,我們指的是「包的名字」而不是那個在use中曾使用的包含路徑的檔名。這會允許你可以在乙個use過的檔案中包含很多包名字。實際使用中這些名字通常是相同的。
use warnings;
你應該開啟warnings來檢測你的模組,因為它可以檢測出很多細微的錯誤。你可以通過在測試模組**中新增-w引數來開啟警告選項。如果你在模組中新增了use warnings,那麼你的模組必須要求執行在perl5.6以上,否則不支援。如果你在模組的頂端新增了$^w++,那麼你將會在全域性範圍內開啟警告選項-這將影響到其他模組,你最好只在你自己的程式中這麼使用,因為這略顯霸道了一些。這有乙個專家寫的叫做"tye":http: 的**來測試警告選項,但沒有直接將它包含進他/她自己的模組中。希望這些會講清楚它是怎樣工作的。
from:
Perl 包和模組
模組就是用包來實現的 使 段不發生衝突而用以分開 的空間。把變數和函式分為不同區間的標記。不同空間中的變數或函式可以同名。使用變數要帶上名空間的字首 name a。用包來實現名字空間 乙個包就是乙個檔案 perl5 用包來建立模組 require 類似c語言的include 把其他地方寫好的程式包含...
perl中陣列的定義和使用
1.資料的定義和使用 方式一 array 1 0 beijing array 1 1 tianjin array 1 2 chongqin 方式二 array 2 beijing tianjin chongqin 2.資料的使用 array 2 beijing tianjin chongqin pr...
python模組定義和使用
模組相當乙個工具類,可以共用或者隱藏 細節,讓重點放在高層邏輯上.也能讓 塊和主程式分離 匯入模組,可以使用模組的所有方法 建立乙個模組,然後引用進來,可以呼叫模組裡所有方法 import make python make python.test function 中國 匯入模組指定方法 前面為模組...