發新話題

Perl簡單模塊指南

Perl簡單模塊指南

下面是這個模塊的內容:

MyModule.pm
複製內容到剪貼板
代碼:
packageMyModule;usestrict;useExporter;usevarsqw($VERSION@ISA@EXPORT@EXPORT_OKEXPORT_TAGS);$VERSION=1.00;@ISA=qw(Exporter);@EXPORT=();@EXPORT_OK=qw(func1func2);EXPORT_TAGS=(DEFAULT=>[qw(&func1)],Both=>[qw(&func1&func2)]);subfunc1{returnreverse@_}subfunc2{returnmap{uc}@_}1;
首先,我們將通過聲明"package"名字來獲得一個名字空間。這將確保模塊中的方法與變量,和調用他們的代碼所分隔開來。usestrict在模塊中是一個非常好的做法,這將使Perl對使用全局變量做出一定的約束。詳細介紹參看"usestrictwarningsanddiagnosticsordie"。
我們需要用Exporter模塊來將我們的函數從MyModule::namespace輸出到main::namespace,讓使用MyModule的程序可以使用這些函數。為了usestrict,我們必須使用usevars來聲明一些變量。當然,在5.6版本以上我們還可以使用our來聲明變量。我們現在設置一個$VERSION數值,然後通過使用@ISA來使得Exporter成為MyModule的一部本。想要瞭解@ISA是什麼以及如何使用等細節,請參考"Code:olice"),但其中1是最方便的。

MySciprt.pl(使用MyModule的一個例子)
複製內容到剪貼板
代碼:
#!/usr/bin/perl-wusestrict;#youmayneedtoset@INChere(seebelow)my@list=qw(Just~Another~Perl~Hacker!);#case1#useMyModule;#printfunc1(@list),"n";#printfunc2(@list),"n";#case2#useMyModuleqw(&func1);#printfunc1(@list),"n";#printMyModule::func2(@list),"n";#case3#useMyModuleqw(:DEFAULT);#printfunc1(@list),"n";#printfunc2(@list),"n";#case4#useMyModuleqw(:Both);#printfunc1(@list),"n";#printfunc2(@list),"n";
正如上面所見,我們在MyScript.pl中使用了MyModule。把中間的註釋符號都去掉來看看會發生什麼。一次都去掉即可。Case1:因為我們的模塊默認什麼都沒有輸出(沒有輸出&func1和&func2),所以我們會得到一個他們在main::namespace中不存在的錯誤。Case2:這個運行正常。我們讓模塊輸出了&func1,於是我們可以正常使用它。儘管我們沒有輸出&func2,但是我們使用的是&func2完整的包路徑,所以它也可以正常工作。Case3:『EFAULT』標籤應該輸出&func1,所以你應該希望返回一個缺少&func2函數的錯誤。但事實上perl卻偏偏找上了&func1的麻煩(錯誤信息提示未定義&func1函數)。恩,這裡怎麼了呢?原來,DEFAULT這個標籤名字是特殊的,在我們的模塊中,EXPORT_TAGS哈希表它會被自動設置成這樣DEFAULT=>@EXPROT.也就是說,DEFAULT默認導出的是來自@EXPROT數組的函數。Case4:我們指定通過『:Both』標籤實現兩個函數都輸出,他實現了。*關於@INC的注意事項*當你提交一個useMyModule的時候,就會指示perl去搜索@INC數組中是否有此模塊名。@INC通常包含:
複製內容到剪貼板
代碼:
/perl/lib/perl/site/lib.
「.」這個目錄表示當前的工作目錄。核心模塊是安裝在perl/lib目錄中,非核心模塊安裝在perl/site/lib目錄中。你可以向@INC中添加自定義目錄。像下面這樣:
複製內容到剪貼板
代碼:
BEGIN{push@INC,'/my/dir'}#orBEGIN{unshift@INC,'/my/dir'}#oruselib'/my/dir';
我們需要使用BEGIN塊在編譯時向@INC中添加值,此時是perl檢查模塊的時刻。
如果你等到程序被編譯的時候就太晚了,perl會拋出一個異常,說「在@INC中無法找到MyModule」.使用push還是unshift方法添加值的區別是,perl搜索@INC的順序是從@INC中的第一個目錄開始的。如果你在/perl/lib/、/perl/site/lib/和./中都有一個MyModule模塊的話,那麼/perl/lib中的模塊將首先被找到並使用。uselib用法可以起到和BEGIN{unshift@INC,$dir}一樣的效果-請參看"perlman:lib:lib":http://www.perlmonks.org/?node=perlman:lib:lib.*useFoo::Bar意味著什麼*useFoo::Bar並不意味著在@INC的目錄中尋找一個叫做Foo::Bar.pm的模塊文件。它的意思是在@INC的目錄中尋找一個叫做『Foo』的「子目錄」,然後在其中找一個叫做「Bar.pm」的「模塊」。現在,如果我們成功"use"了一個模塊,那麼我們就可以通過完整的包路徑語法&ACKAGE::FUNCTION使用這個模塊中的所有函數。當我們說&Foo::Bar::some_func的時候,我們指的是「包的名字」而不是那個在use中曾使用的包含路徑的文件名。這會允許你可以在一個use過的文件中包含很多包名字。實際使用中這些名字通常是相同的。

usewarnings;
你應該打開warnings來檢測你的模塊,因為它可以檢測出很多細微的錯誤。你可以通過在測試模塊代碼中添加-w參數來打開警告選項。如果你在模塊中添加了usewarnings,那麼你的模塊必須要求運行在perl5.6以上,否則不支持。如果你在模塊的頂端添加了$^W ,那麼你將會在全局範圍內打開警告選項-這將影響到其他模塊,你最好只在你自己的程序中這麼使用,因為這略顯霸道了一些。這有一個專家寫的叫做"tye":http://www.perlmonks.org/?node=tye的代碼來測試警告選項,但沒有直接將它包含進他/她自己的模塊中。希望這些會講清楚它是怎樣工作的。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。