Perl package example

========================Perl package======================================

julia@oc2365548284 backup]$ more package.perl
#!/usr/bin/perl
#Perl程序把变量和子程序的-----名称----存储在符号列表中,Perl的符号表中---名字--的集合就称为Perl包(package).
#perl的定义,在一个程序中可以定义多个perl包,每个perl包有一个单独的符号表,定义语法为:
package mypack; ##此语句定义一个名为mypack的perl包,从此以后定义的所有变量和子程序的名字都存储在该perl包关联的符号列表中,直到遇到另一个package语句为止

$var=14;
package mypack;
$var=6;
#第一个语句创建$var变量并存储在main符号表中,第三个语句创建另一个同名变量$var并存储在mypack perl包的符号列表中。
print "$var\n";#此时输出的是6

#------------在程序里可以随时在perl包间来回切换,如:-
package pack1;
$var=16;
package pack2;
$var=34;
package pack1;
print("$var\n");#此时输出的是pack1里的变量。

#-----------------mainPerl 包------------
#存储变量和子程序的名字的缺省符号表是与名为main的perl包相关联的。如果在程序里定义了其他的perl包,当你想切换回去使用缺省的符号表,可以重新指定mainPerl包

package main;##这样接下来的程序就好像从没有定义过的perl包一样,
#--------------Perl包的引用---------
#在一个perl包中可以引用其他perl包中的变量或子程序,方法是在变量名前面加上perl包名和一个单引号,如:
package mypack;
$var=26;
package main;
print ("$mypack'var\n");#这里,$mypack'var为mypackPerl包中的变量$var。
#注意:在Perl5中,Perl包名和变量名用双冒号隔开,即$mypack::var。单引号引用的方式仍然支持,但将来的版本中未必支持。
#------指定无当前Perl包---------------
#在Perl5中,可以用如下语句指定无当前Perl包:
#package;   ###从此以后所有的变量必须明确指出所属Perl包名,否则就无效--错误。
#$mypack::var=21;#ok
#print "#变量必须指明所属perl包名#\n"
#$var=20;#error-nocurrentpacakge,这种情况直到用package语句指定当前perl包为止。


#----------perl包和子程序
#Perl包的定义影响到程序中的所有语句,Perl包括子程序,如:
package mypack;
sub mysub{
local($myvar);
}

#这里mysub和myvar都是Perl包mypack的一部分,在perl包mypack外调用子程序mysub,则需要指定Perl包:$mypack::mysub.


#-----------perl包定义私有数据---------------
#Perl包最通常的用途是用在含有子程序和子程序所使用的全局变量的文件中,为子程序定义这样的Perl包,可以保证子程序使用的全局变量不可在其他地方使用,这样的数
据即为私有数据,更进一步,可以保证Perl包名不可在其它地方使用。

package privpack; #私有部分
$valtoprint=46;
package main; #与外界联系部分,缺省为mainPerl包,
#-----以下sub printval可以被外界调用,因为在main中
sub printval{      #以下3行,定义的子程序printval可被其它程序或子程序调用。
&privpack'printval();#此子程序只有在调用pritval后才能产生输出。
}
#------
package privpack; #私有部分
sub printval{
print ("$valtoprint\n");
}

package main; #将当前Perl包设置回缺省perl包main。

&printval();

#----------访问符号表--------
#在程序中查找符号表可用数组%_pacakge,此处package为想访问的符号表所属的perl包名。%_main含有缺省的符号表。通常不需要亲自查找符号表。
#------------模块-----------------
#多数大型程序都分割成多个部件,没一个部件含有一个或多个程序及相关的变量,执行特定的一个或多个任务。集合了变量和子程序的部件称为程序模块。
#创建模块,在perl5中用perl包来创建模块,方法是创建perl包并将之保存在同名的文件中。例如,名为mymodult的perl包存储在文件mymodult.pm中(扩展名.pm表示perlmo
dule).
#下例的模块mymodult含有子程序myfunc1和myfunc2及变量$myvar1 和myvar2.
#!/usr/bin/perl

package mymodule; #标准的perl模块定义方式
#require export;   #包含内置perl模块export
@isa=qw(export);
@export=qw(myfunc1 myfunc2);  #创建数组,该数组中的子程序可以被其他程序调用
@export_ok=qw($myvar1 $myvar2);  #创建数组 ,其中含有可以被外部程序访问的变量,这里含有$myvar1 和$myvar2。
#perl模式定义结束。

sub myfunc1{
$myvar1+=1;
}

sub myfunc2{
$myvar2+=2;
}

#----导入模块-----------
#下面看一个导入模块和取消导入的例子,使用integer模块要求所有数字运算基于整数,浮点数在运算前均被转化为整数。
use integer;#模块导入使用use mymodule,这样,模块mymodule中的子程序和变量就可以使用了。
$result=2.4+2.4;
print("$result\n");
no integer; #取消模块导入使用no 语句,取消no mymodule模块的导入。
$result=2.4+2.4;
print("$result\n");


#如果use 或 no语句出现的语句块中,则只有在该块的有效范围内起作用,如:
use integer;
$result1=2.4+2.4;
print "result1=$result1\n";
if($result1==4){
no integer;
$result2=3.4+3.4;
print "result2=$result2\n"
};
$result3=4.4+4.4;
print "result3=$result3\n"
#这里,no语句只在if语句中有效,出了if语句扔使用integer模块,因此4.4在做加法钱被转化成了4.

#预定义模块
#Perl5提供了许多有用的预定义模块,可以用use导入和no语句取消。
#--------------类------------
#每个类都是一个包,其包名就是类名,保存类的文件,其文件名应该是类名加上后缀".pm".(这也说明一个文件中只能存放一个类)。
#Perl类是一个Perl包,其中含提供对象方法的Perl类。
#方法是一个Perl子程序,Perl类名是其第一个参数。
#对象是对Perl类中数据项的引用。
#
#
#Perl面向对象编程创建类
#pm是包的缺省扩展名,意为PerlModule,一个模块就是一个包,一个包就是一个类。在做其它之前,先加入"1;"这样一行,当你增加其他行时,记住保留"1;"为最后一行。这
是Perl包的必须条件,否则该包就不会被Perl处理。下面是该文件的基本结构。
#---------require-------------
#把其他地方写好的程序包含进来,当perl解析器看到这一语句,就在内置数组变量@INC指定的目录中寻找你require进来的文件。如果找到了该文件就被执行,否则程序终止
并输出错误信息:Can't find myfile.pl in @INC。也可以用use。
#
#
#类是一个perl包,实现了特定功能的包。其中含方法和数据。
#方法是一个perl子程序,类名是其第一个参数。
#package coffee;
#PUT “require” statements in for all required,imported packages
#just add code here
#1;terminate the pacakge with the required 1;---类的结构就是包的结构,同时也是模块。


##构造函数第一个参数为类名
sub new {
my $this = {};##匿名散列的引用赋值给一个变量, 这个变量在本某块有效。
bless $this;##把这个引用和本类关联起来,说明这个引用是属于这个类的
return $this;##返回引用的值
}

#构造函数的使用
push (@INC,'pwd');#将当前目录加到@INC中供需找包时使用
use coffee;#使用类
$cup=new coffee;#创建对象

#可以使用其他形式调用构造函数
coffee::new()   #new 为coffee类方法,不能支持继承。
coffee->new()
#注意
#一定要在构造函数中初始化变量
#一定要用my函数在方法中创建变量









--More--(99%)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值