Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4309
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-08 11:23
文章分类

全部博文(4)

文章存档

2015年(3)

2014年(1)

我的朋友
最近访客

分类: PERL

2015-01-29 12:37:25

一、
有时候我们只是创建了一些平时打算复用的程序,这个时候在调用相关包时需要的是包内方法,并不是需要通过对象调用。

如果你创建了一个package,这个时候即使没有构造函数、Exporter等也可以对包内的子程序进行调用,例如

点击(此处)折叠或打开

  1. package Pkg_use;
  2. sub direct_print { 
  3.         my ($a)=@_; 
  4.         print "i am in direct_print\n";
  5.         print "$a\n";

  6. sub indirect_print {
  7.         my ($pkg,$a)=@_;
  8.         print "i am in indirect_print\n";
  9.         print "$a\n";
  10. }
  11. 1;
这个时候,有两种对package内子程序的调用,如下

点击(此处)折叠或打开

  1. #!/usr/bin/perl

  2. use Pkg_use;

  3. Pkg_use::direct_print("direct");
  4. Pkg_use->indirect_print("indirect")

结果为:

点击(此处)折叠或打开

  1. i am in direct_print
  2. direct
  3. i am in indirect_print
  4. indirect
第一种为对包内子程序的直接调用使用,输入参数为直接参数;
第二种为方法调用,第一个参数为对象的引用,之后才是输入的参数.

二、
不过上面的包创建完毕之后无法直接进行子程序的调用
必须要加上包名才行,这个时候就需要用到Exporter,@ISA和@EXPORT(出了缺省输出可能还需要@EXPORT_OK)

修改pkg_use如下:


点击(此处)折叠或打开

  1. package Pkg_use2;
  2. require Exporter;
  3. @ISA = qw(Exporter);
  4. @EXPORT = qw(e_print);
  5. @EXPORT_OK = qw(eok_print);

  6. sub e_print { 
  7.         my ($a)=@_; 
  8.         print "i am in e_print\n";
  9.         print "$a\n";

  10. sub eok_print {
  11.         my ($a)=@_;
  12.         print "i am in eok_print\n";
  13.         print "$a\n";
  14. }
  15. 1;
此处的require Exporter;@ISA = qw(Exporter),
这两行包含上Exporter.pm模块,并把Exporter类名加入@ISA数组以供查找。接下来把你自己的类方法列在@EXPORT数组中就可以了。
@EXPORT内为缺省输出函数,@EXPORT_OK内为列举输出函数,当列举时若要引用缺省函数,也需要加在列举列表内,调用如下:

点击(此处)折叠或打开

  1. #!/usr/bin/perl

  2. use lib "E:/data_search/new_test/pkg";

  3. use Pkg_use2 ;
  4. use Pkg_use2 qw(eok_print);

  5. e_print("xiaokang");
  6. 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);

结果为:

点击(此处)折叠或打开

  1. i am in e_print
  2. xiaokang
  3. i am in eok_print
  4. zhangye

三、
 关于继承的问题,继承的子程序只能通过方法调用,通过@ISA的声明完成方法继承,例:

点击(此处)折叠或打开

  1. package Pkg_use3;
  2. use Pkg_use;
  3. @ISA = qw(Pkg_use);

  4. 1;
调用如下:

点击(此处)折叠或打开

  1. #!/usr/bin/perl

  2. use lib "E:/data_search/new_test/pkg";
  3. use Pkg_use3;

  4. Pkg_use3->indirect_print("xiaokang");

结果为:
  1. i am in indirect_print
  2. xiaokang
此处通过use Pkg_use;@ISA = qw(Pkg_use);完成方法的继承,在当前包找不到方法的情况下在@ISA内搜索方法。 















阅读(156) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇: Perl的面向对象的继承

给主人留下些什么吧!~~