?? 第十四章 perl5的包和模塊.htm
字號:
$var1 = 2;<br>
}
</blockquote>
這段代碼創建了兩個變量$var1,一個在包pack1中,一個在包pack2中,包中的局域變量只能在其定義的子程序等語句塊中使用,像普通的局域變量一樣。<br>
<a name="2.7">7、用包定義私有數據</a><br>
包最通常的用途是用在含有子程序和子程序所使用的全局變量的文件中,為子程序定義這樣的包,可以保證子程序使用的全局變量不可在其它地方使用,這樣的數據即為私有數據。更進一步,可以保證包名不可在其它地方使用。私有數據例:<br>
<blockquote>
1 : package privpack;<br>
2 : $valtoprint = 46;<br>
3 : <br>
4 : package main;<br>
5 : # This function is the link to the outside world.<br>
6 : sub printval {<br>
7 : &privpack'printval();<br>
8 : }<br>
9 :<br>
10: package privpack;<br>
11: sub printval {<br>
12: print ("$valtoprint\n");<br>
13: }<br>
14:<br>
15: package main;<br>
16: 1; # return value for require
</blockquote>
此子程序只有在調用printval后才能產生輸出。<br>
該文件分為兩個部分:與外界聯系的部分和私有部分。前者為缺省的main包,后者為包privpack。第6~8行定義的子程序printval可被其它程序或子程序調用。printval輸出變量$valtoprint的值,此變量僅在包privpack中定義和使用。第15、16行確保其被其它程序用require語句包含后工作正常,15行將當前包設置回缺省包main,16行返回非零值使require不報錯。<br>
<a name="2.8">8、包和系統變量</a><br>
下列變量即使從其它包中調用,也在main包中起作用:<br>
<blockquote>
<li>文件變量STDIN, STDOUT, STDERR 和 ARGV </li>
<li>變量%ENV, %INC, @INC, $ARGV 和 @ARGV </li>
<li>其它含有特殊字符的系統變量</li>
</blockquote>
<a name="2.9">9、訪問符號表</a><br>
在程序中查找符號表可用數組%_package,此處package為想訪問的符號表所屬的包名。例如%_main含有缺省的符號表。<br>
通常不需要親自查找符號表。<br><br>
<a name="3">三、模塊</a><br>
多數大型程序都分割成多個部件,每一部件通常含有一個或多個子程序及相關的變量,執行特定的一個或多個任務。集合了變量和子程序的部件稱為程序模塊。<br>
<a name="3.1">1、創建模塊</a><br>
Perl 5中用包來創建模塊,方法是創建包并將之存在同名的文件中。例如,名為Mymodult的包存貯在文件Mymodult.pm中(擴展名.pm表示Perl Module)。下例的模塊Mymodult含有子程序myfunc1和myfunc2及變量$myvar1和$myvar2。<br>
<blockquote>
1 : #!/usr/local/bin/perl<br>
2 :<br>
3 : package Mymodule;<br>
4 : require Exporter;<br>
5 : @ISA = qw(Exporter);<br>
6 : @EXPORT = qw(myfunc1 myfunc2);<br>
7 : @EXPORT_OK = qw($myvar1 $myvar2);<br>
8 :<br>
9 : sub myfunc1 {<br>
10: $myvar1 += 1;<br>
11: }<br>
12:<br>
13: sub myfunc2 {<br>
14: $myvar2 += 2; <br>
15: }
</blockquote>
第3~7行是標準的Perl模塊定義方式。第3行定義包,第4行包含內置Perl模塊Exporter,6、7行進行子程序和變量的輸出以與外界聯系。第6行創建名為@EXPORT的特殊數組,該數組中的子程序可以被其它程序調用,這里,myfunc1和myfunc2可以被訪問。其它任何在模塊中定義但沒有賦給數組@EXPORT的子程序都是私有的,只能在模塊內部調用。第7行創建另一個名為@EXPORT_OK的特殊數組,其中含有可被外部程序訪問的變量,這里含有$myvar1和$myvar2。<br>
<a name="3.2">2、導入模塊</a><br>
將模塊導入你的Perl程序中使用use語句,如下句導入了Mymodule模塊:<br>
use Mymodule;<br>
這樣,模塊Mymodule中的子程序和變量就可以使用了。<br>
取消導入模塊使用no語句,如下句取消了Mymodule模塊的導入:<br>
no Mymodule;<br>
下面看一個導入模塊和取消導入的例子,使用integer模塊要求所有數字運算基于整數,浮點數在運算前均被轉化為整數。<br>
<blockquote>
1: #!/usr/local/bin/perl<br>
2:<br>
3: use integer;<br>
4: $result = 2.4 + 2.4;<br>
5: print ("$result\n");<br>
6:<br>
7: no integer;<br>
8: $result = 2.4 + 2.4;<br>
9: print ("$result\n");
</blockquote>
程序輸出如下:<br>
<blockquote>
$ program<br>
4<br>
4.8<br>
$
</blockquote>
如果use或no語句出現在語句塊中,則只在該塊的有效范圍內起作用,如:<br>
<blockquote>
use integer;<br>
$result1 = 2.4 + 2.4;<br>
if ($result1 == 4) {<br>
no integer;<br>
$result2 = 3.4 + 3.4;<br>
}<br>
$result3 = 4.4 + 4.4;
</blockquote>
結果輸出如下:<br>
<blockquote>
4<br>
6.8<br>
8
</blockquote>
這里,no語句只在if語句中有效,出了if語句仍使用integer模塊,因此4.4在做加法前被轉化成了4。<br>
<a name="3.3">3、預定義模塊</a><br>
Perl 5提供了許多有用的預定義模塊,可以用use導入和no語句取消。下面是庫中最有用的一些模塊:<br>
<p><center>
<TABLE border="1">
<TR VALIGN=TOP>
<TD>integer</TD>
<TD>使用整數運算</TD>
</TR>
<TR VALIGN=TOP>
<TD>Diagnostics </TD>
<TD>輸出較多的診斷信息(警告)</TD>
</TR>
<TR VALIGN=TOP>
<TD>English</TD>
<TD>允許英文名用作系統變量的別名</TD>
</TR>
<TR VALIGN=TOP>
<TD>Env</TD>
<TD>導入環境變量的Perl模塊</TD>
</TR>
<TR VALIGN=TOP>
<TD>POSIX</TD>
<TD>POSIX標準(IEEE 1003.1)的Perl接口 </TD>
</TR>
<TR VALIGN=TOP>
<TD>Socket</TD>
<TD>裝載C語言的套接字處理機制</TD>
</TR>
</TABLE></CENTER></p>
Perl文檔中有完整的預定義模塊列表。<br>
注:世界各地的Perl 5用戶寫了許多有用的模塊,CPAN(Comprehensive Perl Archive Network)的Perl文檔有其完整的列表。關于CPAN的更多信息見其網址:<a target="_blank" href="http://www.perl.com/perl/CPAN/README.html">http://www.perl.com/perl/CPAN/README.html</a>。<br>
<p align="center"><a href="第十三章 Perl的面向對象編程.htm">上一章</a> <a href="附錄一 函數集.htm">下一章</a> <a href="index.htm">目錄</a></p>
<br>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -