明辉站/网站教程/内容

Perl教学(14)Perl5的包与模块之3

网站教程2024-06-07 阅读
[摘要]5、指定无当前包在Perl 5中,可以用如下语句指定无当前包:package;这时,所有的变量必须明确指出所属包名,否则就无效--错误。$mypack::var = 21; #ok$var = 21; #error - no current package这种情况直到用package语句指定当前包...
5、指定无当前包
在Perl 5中,可以用如下语句指定无当前包:
package;
这时,所有的变量必须明确指出所属包名,否则就无效--错误。
$mypack::var = 21; #ok
$var = 21; #error - no current package
这种情况直到用package语句指定当前包为止。
6、包和子程序
包的定义影响到程序中的所有语句,包括子程序,如:

package mypack;
subroutine mysub {
local ($myvar);
# stuff goes here
}
这里,mysub和myvar都是包mypack的一部分。在包mypack外调用子程序mysub,则要指定包:$mypack'mysub。
可以在子程序中切换包:

package pack1;
subroutine mysub {
$var1 = 1;
package pack2;
$var1 = 2;
}
这段代码创建了两个变量$var1,一个在包pack1中,一个在包pack2中,包中的局域变量只能在其定义的子程序等语句块中使用,像普通的局域变量一样。
7、用包定义私有数据
包最通常的用途是用在含有子程序和子程序所使用的全局变量的文件中,为子程序定义这样的包,可以保证子程序使用的全局变量不可在其它地方使用,这样的数据即为私有数据。更进一步,可以保证包名不可在其它地方使用。私有数据例:

1 : package privpack;
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
此子程序只有在调用printval后才能产生输出。
该文件分为两个部分:与外界联系的部分和私有部分。前者为缺省的main包,后者为包privpack。第6~8行定义的子程序printval可被其它程序或子程序调用。printval输出变量$valtoprint的值,此变量仅在包privpack中定义和使用。第15、16行确保其被其它程序用require语句包含后工作正常,15行将当前包设置回缺省包main,16行返回非零值使require不报错。

8、包和系统变量
下列变量即使从其它包中调用,也在main包中起作用:

·文件变量STDIN, STDOUT, STDERR 和 ARGV
·变量%ENV, %INC, @INC, $ARGV 和 @ARGV
·其它含有特殊字符的系统变量
9、访问符号表
在程序中查找符号表可用数组%_package,此处package为想访问的符号表所属的包名。例如%_main含有缺省的符号表。
通常不需要亲自查找符号表。

……

相关阅读