注:此文章为转载(http://blog.sina.com.cn/s/blog_6151984a0100eoha.html)
perl的包(package)和模块(PM)
==================================包package===========================
?? ? package mypack;? 包文件的其始语句
此语句定义一个名为mypack的包,从此以后定义的所有变量和sub的名字都存贮在该包关联的符号表中,直到遇到另一个package语句为止。
??? 包文件——包是面向对象的概念
#!/usr/bin/perl package xxx;??????????? package指令创建“类”;
sub ...???????????????? 创建sub就是创建“类”的“方法” sub ... sub ...
1;??? 包文件结尾要retrun 1 |
?? 包(类)引用:
&mypack'printval(); |
在包mypack外调用包内sub |
$mypack'line=10; or $mypack::line=10; |
在包mypack外调用包内变量
perl5中建议$mypack::var 单引号引用的方式仍然支持,但将来的版本中未必支持 |
???
?? perl文件缺省包——main包
#!/usr/bin/perl
$i=0;
sub gotest { … }?? |
?等价 |
#!/usr/bin/perl package main; $i=0;
sub gotest { … } |
?
??? 如果在程序里package了其它的包,当你想切换回去使用缺省的符号表,可以重新指定package main;
??? 这样,接下来的程序就好象从没定义过包一样
??? 包文件和模块文件都是.pm
其中模块文件,文件名必须与package 名相同
????? 在程序里可以随时在包间来回切换
1: #!/usr/local/bin/perl 2: 3: package pack1; 4: $var = 26; 5: package pack2; 6: $var = 34; 7: package pack1; 8: print ("$varn"); |
$ ./tip.pl 26 $ |
??? 在Perl 5中,可以用package;??? 指定无当前包,这时,所有的变量必须明确指出所属包名,否则报错
package;??? $var = 21; |
?#error - no current package |
? 改正
package;? $mypack::var = 21; |
?? 包造成的私有变量和方法:保证包的变量不可在其它地方使用,这样的数据即为私有数据。
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 ("$valtoprintn");?? 只有同一个包中,才能“直接”调用此变量,其他包中调用此变量要带::前缀或切换package ... 13: } 14: 15: package main; 16: 1;? |