构造函数中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);

时间: 2024-09-20 10:43:10

构造函数中Perl方法用法介绍_应用技巧的相关文章

.NET中的属性用法分析_实用技巧

本文实例分析了.NET中的属性用法.分享给大家供大家参考.具体分析如下: 1.What?什么是属性 属性是对字段的封装.当类中有了一个字段以后,为了控制这个字段对外的一些表现(例如可访问性,是只读?只写?或者对自读赋值做一些必要的验证等等)我们把这个字段私有化(private),同时留出一个公共的(public)方法,用于访问这个字段. 这个方法就是属性.  2.Usage?如何使用  对于属性,.NET总提供了两种方式定义属性.  ① 常规定义方式 复制代码 代码如下: //定义一个私有字段.

ajaxControlToolkit中CascadingDropDown的用法说明_实用技巧

利用Table控制位置来实现 刚好最近在学习ajaxControlToolkit中的控件,想到了CascadingDropDown 层叠下拉 是一个级联联动的下来扩展 挺好用 先介绍下CascadingDropDown的一些属性: TargetControlID 目标控件ID 就是所控制的DropDownList 的ID Category 类别(下个CascadingDropDown取这个上个传过来值的一个类名字,下面代码中会详细说到) PromptText 提示信息 再没有点击所控制DropD

asp.net模板引擎Razor调用外部方法用法实例_实用技巧

本文实例讲述了asp.net模板引擎Razor调用外部方法用法.分享给大家供大家参考.具体如下: 首先使用Razor的步骤:读取cshtml.解析cshtml同时指定cacheName. 而这个步骤是重复的,为了遵循DRY原则,将这段代码封装为一个RazorHelper()方法 public class RazorHelper { public static string ParseRazor(HttpContext context, string csHtmlVirtualPath, obje

.NET中的枚举用法浅析_实用技巧

本文简单分析了.NET中的枚举用法.分享给大家供大家参考.具体分析如下: 我理解的枚举就是编程中约定的一个"可选值":例如QQ的在线状态,分别有    在线,Q我吧,隐身,忙碌等等...我觉得这就是一个枚举. 1.普通枚举 1) 实例 复制代码 代码如下: public enum UserState {  QMe,  OnLine,  OffLine     //后面省略 } ps:像上边的枚举,可以单独写在一个CS文件中. 2)普通枚举的性质 1. 互斥性 2. 每一个值都有一个数值

ASP.NET mvc异常处理的方法示例介绍_实用技巧

1.首先常见保存异常的类(就是将异常信息写入到文件中去) 复制代码 代码如下: public class LogManager { private string logFilePath = string.Empty; public LogManager(string logFilePath) { this.logFilePath = logFilePath; FileInfo file = new FileInfo(logFilePath); if (!file.Exists) { file.C

ASP.NET中的Cache使用介绍_实用技巧

Cache 即高速缓存 ,我想非常多人对他的第一印象一定像我相同,感觉他一定能提高系统得性能和运行速度.的确.Net推出cache的初衷确实是这样的.那么cache是怎么提高系统性能和运行速度呢?是不是在所有情况下用cache都能提高性能?是不是cache用的越多就越好呢?我在近期研发的项目中有所体会,写下来当作总结也希望能跟大家一起探讨探讨,有错误的地方希望大家批评指正. 1.Cache 是怎么工作的 Cache 是分配在服务器上的一个公共的内存片. 所谓公共指的cache只要一创建是所有一个

firefox扩展插件制作方法详细介绍_应用技巧

首先第一步 说一下怎么样查看firefox插件的源码, 就我上边写的那个东西,把它下载下来.将它的扩展名改为zip并解压.会得到一个blueideaserach的文件夹, 这个文件夹中便是我做的这个插件的源码[attach]62937[/attach] 这个目录中除了 chrome目录  chrome.manifest install.rdf  这三个以外都不是必须的. chrome.manifest   这个文件中是对所有文件的一个列表. install.rdf             这个是

c#网站WebConfig中域名引用示例介绍_实用技巧

在WebConfig中定义如下. 复制代码 代码如下: public class WebConfig { public static string ResourceServer = @"http://www.xxx.com/"; } 在前台页面中这样调用 复制代码 代码如下: <script src="<% =WebConfig.ResourceServer %>/js/jquery-ui-all-min-lastest.js" type=&quo

jQuery中next方法用法讲解

  jQuery中next方法用法讲解         这篇文章主要介绍了jQuery中next方法用法,实例分析了jQuery中next方法的功能.定义及相关使用技巧,需要的朋友可以参考下 本文实例讲述了jQuery中next方法用法.分享给大家供大家参考.具体分析如下: 这里演示jQuery中next的用法,可取得一个包含匹配的元素集合中每一个元素紧邻的后面同辈元素的元素集合. 这个函数只返回后面那个紧邻的同辈元素,而不是后面所有的同辈元素. 可以用一个可选的表达式进行筛选 ? 1 2 3