perl面向对象实例_perl

首先让我们来看看有关 Perl 面向对象编程的三个基本定义:

1.  一个“对象”是指一个“有办法知道它是属于哪个类”的简单引用。(对象就是引用变量)
2.  一个“类”是指一个“有办法给属于它的对象提供一些方法”的简单的包。(类就是包)
3.  一个“方法”是指一个“接受一个对象或者类名称作为第一个参数”的简单的子程序。(类的方法就是第一个参数为类名或对象的方法)

一个类只是一个简单的包

和 C++ 不同,Perl 并不为类定义提供任何特殊语法。实际上类只是一个包而已。你可以把一个包当作一个类用,并且把包里的函数当作类的方法来用。不过,有一个特殊的数组,叫做 @ISA,它说明了“当 Perl 在当前包中找不到想要的方法时,应当继续从哪儿去找”。这就是 Perl 实现“继承”的关键。@ISA中的每个元素都是一个别的包的名字。当类找不到方法时,它会从 @ISA 数组中依次寻找(深度优先)。类通过访问 @ISA 来知道哪些类是它的基类。

所有的类都有一个隐含的基类(祖先类):"UNIVERSAL"。"UNIVERSAL" 类为它的子类提供几个通用的类方法。它提供以下几个方法:isa,can。其中isa用来判断变量是否从某个类继承而来,can后面的参数则是一个方法,判断这个方法是否在这个类或者基类中被定义。另外你可以给UNIVERSAL添加新的方法。一旦给它添加了新的方法,所有的class都可以调用。

给UNIBERSAL添加新方法的例子:

复制代码 代码如下:

sub UNIVERSAL::log()
{
my($self,$msg)=@_;
print "$self: $msg\n";
}

这样就可以在每个类中调用这个函数,并且log之前会把类名打印出来。

对象仅仅只是引用

Perl中的构造器只是一个子程序,该子程序返回一个被bless处理的引用,这个经过 bless 处理的引用就是人们所说的“对象”,而 bless 的作用就是用来说明这个对象是隶属于哪个“类”。

最简单的构造器:

复制代码 代码如下:

package Critter;
sub new { bless {} }

如果你希望用户不仅能够用 "CLASS->new()" 这种形式来调用你的构造函数,还能够以 "$obj->new()" 这样的形式来调用的话,那么就这么做:

复制代码 代码如下:

sub new {
my $this = shift;
my $class = ref($this) || $this;
my $self = {};
bless $self, $class;
$self->initialize();
return $self;
}

一个方法就是一个简单的子程序

方法把它被调用时的对象或者类名称当作它的第一个参数。有两种不同的调用方法的途径,分别成为“调用类方法”和“调用实例方法”。类方法把类名当作第一个参数。它提供针对类的功能,而不是针对某个具体的对象的功能。构造器通常是一个类方法。大多数类方法简单地忽略第一个参数,因为方法知道自己处在什么类里面,也不关心它是通过什么类来调用的。
Perl 提供了两种不同的形式去调用一个方法。最简单的形式是采用箭头符号:

复制代码 代码如下:

        my $fred = Critter->find("Fred");
        $fred->display("Height", "Weight");

你可以早就熟悉了引用的 "->" 操作符。事实上,因为上面的 $fred是一个指向了对象的引用,因此你也可以把箭头操作符理解为另外一种形式的解引用。

出现在箭头左边的引用或者类名,将作为第一个参数传递给箭头右边的方法。所以上面的代码就分别相当于这样:

复制代码 代码如下:

        my $fred = Critter::find("Critter", "Fred");
        Critter::display($fred, "Height", "Weight");

简单示例

1、说明

本程序演示了在Perl中如何进行面向对象编程:演示程序包含两个文件:person.pl 和 person.pm,把 person.pl 和 person.pm 放在当前目录下,运行"perl person.pl"即可以看到结果。person.pm定义了名为person的类。person.pl中创建了person类的实例,并测试了person的成员方法。

2、person.pm的内容

复制代码 代码如下:

#!/usr/bin/perl -w
package person;
use strict;

sub new {
my $class = shift();
print("CLASS = $class\n");
my $self = {};
$self->{"name"} = shift();
$self->{"sex"} = shift();
bless $self, $class;
return $self;
}

sub getName {
my ($self) = @_;
return $self->{"name"};
}

sub setName {
my ($self, $name) = @_;
$self->{"name"} = $name;
}

sub getSex {
my ($self) = @_;
return $self->{"sex"};
}

sub setSex {
my ($self, $sex) = @_;
$self->{"sex"} = $sex;
}

3、person.pl的内容

复制代码 代码如下:

#!/usr/bin/perl -w
use strict;
use person;

sub main()
{
my $tom = person->new("Tom", "male");
my $kiss = person->new("Kiss", "female");
my @persons = ($tom, $kiss);
for my $p (@persons) {
printf("NAME: %s\tSEX: %s\n", $p->getName(), $p->getSex());
}
}

&main();

4、程序运行结果

复制代码 代码如下:

CLASS = person
CLASS = person
NAME: Tom SEX: male
NAME: Kiss SEX: female

时间: 2024-10-01 11:35:45

perl面向对象实例_perl的相关文章

使用perl实现拆分数据表(mysql)并迁移数据实例_perl

随着业务量的增长,可能需要对表进行拆分来提高性能. 下面这个例子是将www.jb51.net的users表拆分成10个表ttlsa_user_0-ttlsa_user_9. 拆分迁移数据程序如下所示: 1.创建ttlsa_user_0-ttlsa_user_9表 复制代码 代码如下: #!/usr/bin/perl ################################### ### author: www.jb51.net ### ### QQ群:232608061  ### ###

Perl的Mail::POP3Client模块和Gmail通信实例_perl

一.前言 最近在写一个从gmail批量下载附件的程序,用到了 Mail::POP3Client 和 MIME::Parser 2 个模块 二.相关文档 CPAN: Mail::POP3Client模块 MIME::Parser模块 StrawberryPerl模块的安装.卸载与查看 三.实现 use Mail::POP3Client; use MIME::Parser; my $U = 'User.Name@gmail.com'; my $P = 'uSeR.pAsSwORd'; my $X =

perl中使用signal(信号)实例_perl

使用signal,能让你的程序功能更丰富.要在Linux下列出所有的signal, 利用kill -l即可. 下面是我机器上的输出(后面还有到64的没列出来): 复制代码 代码如下: xuyang@xuyang-desktop:/$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8 ) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SI

Perl使用nginx FastCGI环境做WEB开发实例_perl

Hello World 一个简单的hello world例子: 复制代码 代码如下: #!/usr/bin/env perluse strict;use warnings;use CGI::Fast;while(my $q = new CGI::Fast){ print $q->header("text/plain"); print "Hello World";} 和CGI的区别仅在于多了一个循环来接受请求,CGI::Fast对象和CGI接口是一样的,而且该脚

Perl AnyEvent中的watcher实例_perl

这几天看了下perl的事件编程框架AnyEvent,重点参考了一下几篇文章: http://search.cpan.org/~mlehmann/AnyEvent-7.05/lib/AnyEvent.pm http://search.cpan.org/~mlehmann/AnyEvent-7.05/lib/AnyEvent/Intro.pod http://www.jb51.net/article/55278.htm 1.什么是事件编程? 举个简单的例子,你浏览网页的时候,你点击一个图片,蹭的弹出

Perl List::Util模块使用实例_perl

在Perl中有一些专门用于处理列表数据的模块,比如说List::Util模块,该模块包含在标准库中,能提供各种高效的常见列表处理工具.因其用C语言来实现,速度一般都挺快! [例01]扫描符合条件的某个列表,并取出第一个符合条件的常规做法: 复制代码 代码如下: use 5.010;  my @names  = qw(Wendy Jerry Betty Wendy Alice);  foreach  (@names) {      if (/\bWendy\b/i) {          $mat

Perl eval函数使用实例_perl

Perl 作为一种脚本语言可以实时地生成和执行代码.这种特性可以把代码的编译推迟到运行时,所以又称为"动态代码".另外, Perl 也如 Java . C++ 一样提供了异常处理机制.本文将初步探讨Perl 中实现动态代码和异常处理机制的函数: eval .如有错误不足,欢迎讨论和批评指正. eval 函数可以看作是 Perl 虚拟机,它的参数就是一段 Perl 代码.利用 'perldoc –f eval'可以获取 eval 函数使用帮助,其中介绍了它的两种使用方式: 复制代码 代码

Perl访问MSSQL并迁移到MySQL数据库脚本实例_perl

Linux下没有专门为MSSQL设计的访问库,不过介于MSSQL本是从sybase派生出来的,因此用来访问Sybase的库自然也能访问MSSQL,FreeTDS就是这么一个实现.Perl中通常使用DBI来访问数据库,因此在系统安装了FreeTDS之后,可以使用DBI来通过FreeTDS来访问MSSQL数据库,例子: 复制代码 代码如下: using DBI;my $cs = "DRIVER={FreeTDS};SERVER=主机;PORT=1433;DATABASE=数据库;UID=sa;PWD

Perl生成纯HTML代码二维码实例_perl

需要依次安装 qrencode.Text-QRCode.HTML-QRCode #!/usr/bin/perl use HTML::QRCode; my $text = 'http://jb51.net/'; my $qrcode = HTML::QRCode->new->plot($text); print <<"HTML"; <html>   <head></head>   <body>   $qrcode