第十四章 Perl5的包和模塊
一、require函數(shù)@reqlist = ("file1.pl", "file2.pl", "file3.pl");還可以不指定文件名,即:
require ($reqlist[$0]);
require ($reqlist[$1]);
require ($reqlist[$2]);
a、確定存貯子程序庫的目錄例如:假設(shè)目錄/u/perldir中存有你的Perl子程序庫,子程序mysub存貯在文件mysub.pl中,F(xiàn)在來包含上該文件:
b、將子程序抽取放到單獨的文件中,將文件放到子程序庫目錄
c、每個文件末尾加一句非零值的語句,最簡單的辦法是語句 1;
d、在主程序中用require包含一個或多個所需的文件。
e、運行主程序時,用 -I 選項指定子程序庫目錄,或者在調(diào)用require前將該目錄添加到@INC數(shù)組中。
1、應(yīng)該使用unshift來向@INC中添加目錄,而不是push。因為push增加到@INC的末尾,則該目錄將被最后搜尋。2、用require指定Perl版本
2、如果你的庫文件名與/usr/local/lib/perl中的某文件同名,則不會被包含進來,因為require只包含同名文件中的第一個。
$var = 14;第一個語句創(chuàng)建變量$var并存貯在main符號表中,第三個語句創(chuàng)建另一個同名變量$var并存貯在mypack包的符號表中。
package mypack;
$var = 6;
1: #!/usr/local/bin/perl運行結(jié)果如下:
2:
3: package pack1;
4: $var = 26;
5: package pack2;
6: $var = 34;
7: package pack1;
8: print ("$var\n");
$ program第三行定義了包pack1,第四行創(chuàng)建變量$var,存貯在包pack1的符號表中,第五行定義新包pack2,第六行創(chuàng)建另一個變量$var,存貯在包pack2的符號表中。這樣就有兩個獨立的$var,分別存貯在不同的包中。第七行又指定pack1為當前包,因為包pack1已經(jīng)定義,這樣,所有變量和子程序的定義和調(diào)用都為該包的符號表中存貯的名字。因此第八行對$var的調(diào)用為pack1包中的$var,其值為26。
26
$
package mypack;這里,$mypack'var為mypack包中的變量$var。
$var = 26;
package main;
print ("$mypack'var\n");
package mypack;這里,mysub和myvar都是包mypack的一部分。在包mypack外調(diào)用子程序mysub,則要指定包:$mypack'mysub。
subroutine mysub {
local ($myvar);
# stuff goes here
}
package pack1;這段代碼創(chuàng)建了兩個變量$var1,一個在包pack1中,一個在包pack2中,包中的局域變量只能在其定義的子程序等語句塊中使用,像普通的局域變量一樣。
subroutine mysub {
$var1 = 1;
package pack2;
$var1 = 2;
}
1 : package privpack;此子程序只有在調(diào)用printval后才能產(chǎn)生輸出。
2 : $valtoprint = 46;
3 :
4 : package main;
5 : # This function is the link to the outside world.
6 : sub printval {
7 : &privpack'printval();
8 : }
9 :
10: package privpack;
11: sub printval {
12: print ("$valtoprint\n");
13: }
14:
15: package main;
16: 1; # return value for require
9、訪問符號表文件變量STDIN, STDOUT, STDERR 和 ARGV 變量%ENV, %INC, @INC, $ARGV 和 @ARGV 其它含有特殊字符的系統(tǒng)變量
1 : #!/usr/local/bin/perl第3~7行是標準的Perl模塊定義方式。第3行定義包,第4行包含內(nèi)置Perl模塊Exporter,6、7行進行子程序和變量的輸出以與外界聯(lián)系。第6行創(chuàng)建名為@EXPORT的特殊數(shù)組,該數(shù)組中的子程序可以被其它程序調(diào)用,這里,myfunc1和myfunc2可以被訪問。其它任何在模塊中定義但沒有賦給數(shù)組@EXPORT的子程序都是私有的,只能在模塊內(nèi)部調(diào)用。第7行創(chuàng)建另一個名為@EXPORT_OK的特殊數(shù)組,其中含有可被外部程序訪問的變量,這里含有$myvar1和$myvar2。
2 :
3 : package Mymodule;
4 : require Exporter;
5 : @ISA = qw(Exporter);
6 : @EXPORT = qw(myfunc1 myfunc2);
7 : @EXPORT_OK = qw($myvar1 $myvar2);
8 :
9 : sub myfunc1 {
10: $myvar1 += 1;
11: }
12:
13: sub myfunc2 {
14: $myvar2 += 2;
15: }
1: #!/usr/local/bin/perl程序輸出如下:
2:
3: use integer;
4: $result = 2.4 + 2.4;
5: print ("$result\n");
6:
7: no integer;
8: $result = 2.4 + 2.4;
9: print ("$result\n");
$ program如果use或no語句出現(xiàn)在語句塊中,則只在該塊的有效范圍內(nèi)起作用,如:
4
4.8
$
use integer;結(jié)果輸出如下:
$result1 = 2.4 + 2.4;
if ($result1 == 4) {
no integer;
$result2 = 3.4 + 3.4;
}
$result3 = 4.4 + 4.4;
4這里,no語句只在if語句中有效,出了if語句仍使用integer模塊,因此4.4在做加法前被轉(zhuǎn)化成了4。
6.8
8
integer | 使用整數(shù)運算 |
Diagnostics | 輸出較多的診斷信息(警告) |
English | 允許英文名用作系統(tǒng)變量的別名 |
Env | 導入環(huán)境變量的Perl模塊 |
POSIX | POSIX標準(IEEE 1003.1)的Perl接口 |
Socket | 裝載C語言的套接字處理機制 |