第十四章 Perl5的包和模块
一、require函数@reqlist = ("file1.pl", "file2.pl", "file3.pl");还可以不指定文件名,即:
require ($reqlist[$0]);
require ($reqlist[$1]);
require ($reqlist[$2]);
a、确定存贮子程序库的目录例如:假设目录/u/perldir中存有你的Perl子程序库,子程序mysub存贮在文件mysub.pl中。现在来包含上该文件:
b、将子程序抽取放到单独的文件中,将文件放到子程序库目录
c、每个文件末尾加一句非零值的语句,最简单的办法是语句 1;
d、在主程序中用require包含一个或多个所需的文件。
e、运行主程序时,用 -I 选项指定子程序库目录,或者在调用require前将该目录添加到@INC数组中。
1、应该使用unshift来向@INC中添加目录,而不是push。因为push增加到@INC的末尾,则该目录将被最后搜寻。2、用require指定Perl版本
2、如果你的库文件名与/usr/local/lib/perl中的某文件同名,则不会被包含进来,因为require只包含同名文件中的第一个。
$var = 14;第一个语句创建变量$var并存贮在main符号表中,第三个语句创建另一个同名变量$var并存贮在mypack包的符号表中。
package mypack;
$var = 6;
1: #!/usr/local/bin/perl运行结果如下:
2:
3: package pack1;
4: $var = 26;
5: package pack2;
6: $var = 34;
7: package pack1;
8: print ("$var\n");
$ program第三行定义了包pack1,第四行创建变量$var,存贮在包pack1的符号表中,第五行定义新包pack2,第六行创建另一个变量$var,存贮在包pack2的符号表中。这样就有两个独立的$var,分别存贮在不同的包中。第七行又指定pack1为当前包,因为包pack1已经定义,这样,所有变量和子程序的定义和调用都为该包的符号表中存贮的名字。因此第八行对$var的调用为pack1包中的$var,其值为26。
26
$
package mypack;这里,$mypack'var为mypack包中的变量$var。
$var = 26;
package main;
print ("$mypack'var\n");
package mypack;这里,mysub和myvar都是包mypack的一部分。在包mypack外调用子程序mysub,则要指定包:$mypack'mysub。
subroutine mysub {
local ($myvar);
# stuff goes here
}
package pack1;这段代码创建了两个变量$var1,一个在包pack1中,一个在包pack2中,包中的局域变量只能在其定义的子程序等语句块中使用,像普通的局域变量一样。
subroutine mysub {
$var1 = 1;
package pack2;
$var1 = 2;
}
1 : package privpack;此子程序只有在调用printval后才能产生输出。
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 其它含有特殊字符的系统变量
1 : #!/usr/local/bin/perl第3~7行是标准的Perl模块定义方式。第3行定义包,第4行包含内置Perl模块Exporter,6、7行进行子程序和变量的输出以与外界联系。第6行创建名为@EXPORT的特殊数组,该数组中的子程序可以被其它程序调用,这里,myfunc1和myfunc2可以被访问。其它任何在模块中定义但没有赋给数组@EXPORT的子程序都是私有的,只能在模块内部调用。第7行创建另一个名为@EXPORT_OK的特殊数组,其中含有可被外部程序访问的变量,这里含有$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语句出现在语句块中,则只在该块的有效范围内起作用,如:
4
4.8
$
use integer;结果输出如下:
$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在做加法前被转化成了4。
6.8
8
integer | 使用整数运算 |
Diagnostics | 输出较多的诊断信息(警告) |
English | 允许英文名用作系统变量的别名 |
Env | 导入环境变量的Perl模块 |
POSIX | POSIX标准(IEEE 1003.1)的Perl接口 |
Socket | 装载C语言的套接字处理机制 |