构造函数中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);
下一篇: perl比较两个文件字符串的实例代码
推荐阅读
-
python中string模块各属性以及函数的用法介绍
-
Python中的对象,方法,类,实例,函数用法分析
-
JavaScript中利用构造器函数模拟类的方法
-
C#中构造函数和析构函数用法实例详解
-
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
-
python中string模块各属性以及函数的用法介绍
-
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
-
php中get_headers函数的作用及用法的详细介绍
-
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
-
java中的构造方法,this、super的用法