一、
有时候我们只是创建了一些平时打算复用的程序,这个时候在调用相关包时需要的是包内方法,并不是需要通过对象调用。
如果你创建了一个package,这个时候即使没有构造函数、Exporter等也可以对包内的子程序进行调用,例如:
-
package Pkg_use;
-
sub direct_print {
-
my ($a)=@_;
-
print "i am in direct_print\n";
-
print "$a\n";
-
}
-
sub indirect_print {
-
my ($pkg,$a)=@_;
-
print "i am in indirect_print\n";
-
print "$a\n";
-
}
-
1;
这个时候,有两种对package内子程序的调用,如下
-
#!/usr/bin/perl
-
-
use Pkg_use;
-
-
Pkg_use::direct_print("direct");
-
Pkg_use->indirect_print("indirect")
结果为:
-
i am in direct_print
-
direct
-
i am in indirect_print
-
indirect
第一种为对包内子程序的直接调用使用,输入参数为直接参数;
第二种为方法调用,第一个参数为对象的引用,之后才是输入的参数.
二、
不过上面的包创建完毕之后无法直接进行子程序的调用
必须要加上包名才行,这个时候就需要用到Exporter,@ISA和@EXPORT(出了缺省输出可能还需要@EXPORT_OK)
-
package Pkg_use2;
-
require Exporter;
-
@ISA = qw(Exporter);
-
@EXPORT = qw(e_print);
-
@EXPORT_OK = qw(eok_print);
-
-
sub e_print {
-
my ($a)=@_;
-
print "i am in e_print\n";
-
print "$a\n";
-
}
-
sub eok_print {
-
my ($a)=@_;
-
print "i am in eok_print\n";
-
print "$a\n";
-
}
-
1;
此处的require Exporter;@ISA = qw(Exporter),
这两行包含上Exporter.pm模块,并把Exporter类名加入@ISA数组以供查找。接下来把你自己的类方法列在@EXPORT数组中就可以了。
@EXPORT内为缺省输出函数,@EXPORT_OK内为列举输出函数,当列举时若要引用缺省函数,也需要加在列举列表内,调用如下:
-
#!/usr/bin/perl
-
-
use lib "E:/data_search/new_test/pkg";
-
-
use Pkg_use2 ;
-
use Pkg_use2 qw(eok_print);
-
-
e_print("xiaokang");
-
eok_print("zhangye");
此处use lib可以省略,但是以后最好加上,use lib之后路径被加入搜索列表@INC,直接push或者unshift虽然能压入@INC,但是起不到
搜索作用。此处路径为默认包之外的路径。
同时use Pkg_use2 ;use Pkg_use2 qw(eok_print);不能删除use Pkg_use2 ;不然缺省函数无法调用,但是可以合成一处,写为
use Pkg_use2 qw(e_print eok_print);
结果为:
-
i am in e_print
-
xiaokang
-
i am in eok_print
-
zhangye
三、
关于继承的问题,继承的子程序只能通过方法调用,通过@ISA的声明完成方法继承,例:
-
package Pkg_use3;
-
use Pkg_use;
-
@ISA = qw(Pkg_use);
-
-
1;
调用如下:
-
#!/usr/bin/perl
-
-
use lib "E:/data_search/new_test/pkg";
-
use Pkg_use3;
-
-
Pkg_use3->indirect_print("xiaokang");
结果为:
-
i am in indirect_print
-
xiaokang
此处通过use Pkg_use;@ISA = qw(
Pkg_use);完成方法的继承,在当前包找不到方法的情况下在
@ISA内搜索方法。
阅读(156) | 评论(0) | 转发(0) |