欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

构造函数中Perl方法用法介绍

程序员文章站 2022-07-11 15:17:13
perl语言中perl方法的概念你是否了解,这里向大家简单介绍一下,perl类的perl方法只不过是一个perl子程序而已,也即通常所说的成员函数。 perl方法 一、...
perl语言中perl方法的概念你是否了解,这里向大家简单介绍一下,perl类的perl方法只不过是一个perl子程序而已,也即通常所说的成员函数。

perl方法

一、perl方法简介

perl类的perl方法只不过是一个perl子程序而已,也即通常所说的成员函数。perl方法定义不提供任何特殊语法,但规定perl方法的第一个参数为对象或其被引用的包。perl有两种perl方法:静态perl方法和虚perl方法。
静态perl方法第一个参数为类名,虚perl方法第一个参数为对象的引用。perl方法处理第一个参数的方式决定了它是静态的还是虚的。静态perl方法一般忽略掉第一个参数,因为它们已经知道自己在哪个类了,构造函数即静态perl方法。虚perl方法通常首先把第一个参数shift到变量self或this中,然后将该值作普通的引用使用。如:

复制代码 代码如下:

subnamelister{ 
my$this=shift; 
my($keys,$value); 
while(($key,$value)=each(%$this)){ 
print"\t$keyis$value.\n"; 


二、perl方法的输出

如果你现在想引用cocoa.pm包,将会得到编译错误说未找到perl方法,这是因为cocoa.pm的perl方法还没有输出。输出perl方法需要exporter模块,在包的开始部分加上下列两行:
requireexporter;
@isa=qw(exporter);
这两行包含上exporter.pm模块,并把exporter类名加入@isa数组以供查找。接下来把你自己的类perl方法列在@export数组中就可以了。例如想输出perl方法closemain和declaremain,语句如下:
@export=qw(declaremain,closemain);
perl类的继承是通过@isa数组实现的。@isa数组不需要在任何包中定义,然而,一旦它被定义,perl就把它看作目录名的特殊数组。它与@inc数组类似,@inc是包含文件的寻找路径。@isa数组含有类(包)名,当一个perl方法在当前包中未找到时就到@isa中的包去寻找。@isa中还含有当前类继承的基类名。

类中调用的所有perl方法必须属于同一个类或@isa数组定义的基类。如果一个perl方法在@isa数组中未找到,perl就到autoload()子程序中寻找,这个可选的子程序在当前包中用sub定义。若使用autoload子程序,必须用useautoload;语句调用autoload.pm包。autoload子程序尝试从已安装的perl库中装载调用的perl方法。如果autoload也失败了,perl再到universal类做最后一次尝试,如果仍失败,perl就生成关于该无法解析函数的错误。

三、perl方法的调用

调用一个对象的perl方法有两种perl方法,一是通过该对象的引用(虚perl方法),一是直接使用类名(静态perl方法)。当然该perl方法必须已被输出。

现在,我们写一个简单的perl脚本来使用该类的perl方法,下面是创建一个javaapplet源代码骨架的脚本代码:

复制代码 代码如下:

#!/usr/bin/perl 
usecocoa; 
$cup=newcocoa; 
$cup->setimports('java.io.inputstream','java.net.*'); 
$cup->declaremain("msg","java.applet.applet","runnable"); 
$cup->closemain(); 

这段脚本创建了一个叫做msg的javaapplet,它扩展(extend)了java.applet.applet小应用程序并使之可运行(runnable),其中最后三行也可以写成如下: 
cocoa::setimports($cup,'java.io.inputstream','java.net.*'); 
cocoa::declaremain($cup,"msg","java.applet.applet","runnable"); 
cocoa::closemain($cup); 
其运行结果如下: 
/* 
**createdbycocoa.pm 
**useatownrisk 
*/ 
importjava.io.inputstream; 
importjava.net.*; 

publicclassmsgextendsjava.applet.appletimplementsrunnable{ 


注意:如果用->操作符调用perl方法(也叫间接调用),参数必须用括号括起来,如:$cup->setimports('java.io.inputstream','java.net.*');而双冒号调用如:cocoa::setimports($cup,'java.io.inputstream','java.net.*');也可去掉括号写成:cocoa::setimports$cup,'java.io.inputstream','java.net.*';

四、重载

有时需要指定使用哪个类的perl方法,如两个不同的类有同名perl方法的时候。假设类espresso和qava都定义了perl方法grind,可以用::操作符指定使用qava的perl方法:
$mess=qava::grind("whole","lotta","bags");
qava::grind($mess,"whole","lotta","bags");
可以根据程序的运行情况来选择使用哪个类的perl方法,这可以通过使用符号引用去调用来实现:
$method=$local?"qava::":"espresso::";
$cup->{$method}grind(@args);