无涯教程-Perl - 面向对象

 Perl中的面向对象概念很大程度上基于引用以及匿名数组和哈希。让我们开始学习面向对象Perl的基本概念。

定义类

在Perl中定义一个类非常简单。类以最简单的形式对应于Perl软件包。要在Perl中创建一个类,我们首先构建一个包。

Perl软件包在Perl程序中提供了一个单独的名称空间,该名称空间使子例程和变量独立于与其他软件包中的子例程和变量的冲突。

package Person;

创建对象

要创建类的实例,我们需要一个对象构造函数。此构造函数是在包内定义的方法。大多数程序员选择将此对象构造函数方法命名为new,但是在Perl中可以使用任何名称。

package Person;
sub new {my $class=shift;my $self={_firstName => shift,_lastName  => shift,_ssn       => shift,};# Print all the values just for clarification.print "First Name is $self->{_firstName}\n";print "Last Name is $self->{_lastName}\n";print "SSN is $self->{_ssn}\n";bless $self, $class;return $self;
}

现在,让我们看看如何创建一个对象。

$object=new Person( "Mohammad", "Saleem", 23234345);

如果不想将任何值分配给任何类变量,则可以在构造函数中使用简单哈希。例如-

package Person;
sub new {my $class=shift;my $self={};bless $self, $class;return $self;
}

定义方法

其他面向对象的语言具有数据安全性的概念,以防止程序员直接更改对象数据,并且它们提供访问器方法来修改对象数据。 Perl没有私有变量,但是我们仍然可以使用辅助方法的概念来操作对象数据。

让我们定义一个辅助方法来获取人的名字-

sub getFirstName {return $self->{_firstName};
}

另一个用于设置人的名字-

sub setFirstName {my ( $self, $firstName )=@_;$self->{_firstName}=$firstName if defined($firstName);return $self->{_firstName};
}

现在让我们看一个完整的示例:将Person包和辅助函数保存在Person.pm文件中。

#!/usr/bin/perl package Person;sub new {my $class=shift;my $self={_firstName => shift,_lastName  => shift,_ssn       => shift,};# Print all the values just for clarification.print "First Name is $self->{_firstName}\n";print "Last Name is $self->{_lastName}\n";print "SSN is $self->{_ssn}\n";bless $self, $class;return $self;
}
sub setFirstName {my ( $self, $firstName )=@_;$self->{_firstName}=$firstName if defined($firstName);return $self->{_firstName};
}sub getFirstName {my( $self )=@_;return $self->{_firstName};
}
1;

现在让我们如下使用employee.pl文件中的Person对象-

#!/usr/bin/perluse Person;$object=new Person( "Mohammad", "Saleem", 23234345);
# Get first name which is set using constructor.
$firstName=$object->getFirstName();print "Before Setting First Name is : $firstName\n";# Now Set first name using helper function.
$object->setFirstName( "Mohd." );# Now get first name set by helper function.
$firstName=$object->getFirstName();
print "Before Setting First Name is : $firstName\n";

当我们执行以上程序时,它产生以下输出-

First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.

类继承

例如,我们可以有一个Employee类,该类继承自Person。这被称为" isa"关系,因为员工是一个人。 Perl有一个特殊的变量@ISA,以帮助解决此问题。 @ISA控制(方法)继承。

因此,要创建一个新的Employee类以继承Person类的方法和属性,我们只需编写以下代码:将这些代码保存在Employee.pm中。

#!/usr/bin/perlpackage Employee;
use Person;
use strict;
our @ISA=qw(Person);    # inherits from Person

现在,Employee Class具有从Person类继承的所有方法和属性,您可以按如下方式使用它们:使用main.pl文件对其进行测试-

#!/usr/bin/perluse Employee;$object=new Employee( "Mohammad", "Saleem", 23234345);
# Get first name which is set using constructor.
$firstName=$object->getFirstName();print "Before Setting First Name is : $firstName\n";# Now Set first name using helper function.
$object->setFirstName( "Mohd." );# Now get first name set by helper function.
$firstName=$object->getFirstName();
print "After Setting First Name is : $firstName\n";

当我们执行以上程序时,它产生以下输出-

First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.

方法重载

子类Employee从父类Person继承所有方法。但是,如果您想在子类中覆盖这些方法,则可以通过提供自己的实现来实现。您可以在子类中添加其他函数,也可以在其父类中添加或修改现有方法的函数。可以按照以下步骤完成:修改Employee.pm文件。

#!/usr/bin/perlpackage Employee;
use Person;
use strict;
our @ISA=qw(Person);    # inherits from Person# Override constructor
sub new {my ($class)=@_;# Call the constructor of the parent class, Person.my $self=$class->SUPER::new( $_[1], $_[2], $_[3] );# Add few more attributes$self->{_id}  =undef;$self->{_title}=undef;bless $self, $class;return $self;
}# Override helper function
sub getFirstName {my( $self )=@_;# This is child class function.print "This is child class helper function\n";return $self->{_firstName};
}# Add more methods
sub setLastName{my ( $self, $lastName )=@_;$self->{_lastName}=$lastName if defined($lastName);return $self->{_lastName};
}sub getLastName {my( $self )=@_;return $self->{_lastName};
}1;

现在,让我们再次尝试在main.pl文件中使用Employee对象并执行它。

#!/usr/bin/perluse Employee;$object=new Employee( "Mohammad", "Saleem", 23234345);
# Get first name which is set using constructor.
$firstName=$object->getFirstName();print "Before Setting First Name is : $firstName\n";# Now Set first name using helper function.
$object->setFirstName( "Mohd." );# Now get first name set by helper function.
$firstName=$object->getFirstName();
print "After Setting First Name is : $firstName\n";

当我们执行以上程序时,它产生以下输出-

First Name is Mohammad
Last Name is Saleem
SSN is 23234345
This is child class helper function
Before Setting First Name is : Mohammad
This is child class helper function
After Setting First Name is : Mohd.

自动加载

Perl提供了其他任何编程语言都找不到的函数:默认子程序。这意味着,如果定义一个名为 AUTOLOAD的函数,那么对未定义子例程的任何调用都会自动调用AUTOLOAD函数。缺少的子例程的名称可以在该子例程中以$AUTOLOAD的形式访问。

默认的自动加载函数对于错误处理非常有用。这是实现AUTOLOAD的示例,您可以以自己的方式实现此函数。

sub AUTOLOAD {my $self=shift;my $type=ref ($self) || croak "$self is not an object";my $field=$AUTOLOAD;$field =~ s/.*://;unless (exists $self->{$field}) {croak "$field does not exist in object/class $type";}if (@_) {return $self->($name)=shift;} else {return $self->($name);}
}

垃圾回收

如果您以前使用面向对象编程进行编程,那么您将意识到有必要创建析构函数,以在使用完对象后释放分配给该对象的内存。一旦对象超出范围,Perl就会自动为您执行此操作。

析构函数方法只是名为DESTROY的成员函数在以下情况下会自动调用-

  • 当对象引用的变量超出范围时。
  • 未定义对象引用的变量时。
  • 脚本终止时。
  • 当perl解释器终止时。

例如,您可以将以下方法DESTROY放在您的类中-

package MyClass;
...
sub DESTROY {print "MyClass::DESTROY called\n";
}

完整示例

这是另一个不错的示例,它将帮助您理解Perl的面向对象概念。将此源代码放入任何perl文件中并执行它。

#!/usr/bin/perl# Following is the implementation of simple Class.
package MyClass;sub new {print "MyClass::new called\n";my $type=shift;            # The package/type namemy $self={};               # Reference to empty hashreturn bless $self, $type;   
}sub DESTROY {print "MyClass::DESTROY called\n";
}sub MyMethod {print "MyClass::MyMethod called!\n";
}# Following is the implemnetation of 遗产.
package MySubClass;@ISA=qw( MyClass );sub new {print "MySubClass::new called\n";my $type=shift;            # The package/type namemy $self=MyClass->new;     # Reference to empty hashreturn bless $self, $type;  
}sub DESTROY {print "MySubClass::DESTROY called\n";
}sub MyMethod {my $self=shift;$self->SUPER::MyMethod();print "   MySubClass::MyMethod called!\n";
}# Here is the main program using above classes.
package main;print "Invoke MyClass method\n";$myObject=MyClass->new();
$myObject->MyMethod();print "Invoke MySubClass method\n";$myObject2=MySubClass->new();
$myObject2->MyMethod();print "Create a scoped object\n";
{my $myObject2=MyClass->new();
}
# Destructor is called automatically hereprint "Create and undef an object\n";
$myObject3=MyClass->new();
undef $myObject3;print "Fall off the end of the script...\n";
# Remaining destructors are called automatically here

当我们执行以上程序时,它产生以下输出-

Invoke MyClass method
MyClass::new called
MyClass::MyMethod called!
Invoke MySubClass method
MySubClass::new called
MyClass::new called
MyClass::MyMethod called!
MySubClass::MyMethod called!
Create a scoped object
MyClass::new called
MyClass::DESTROY called
Create and undef an object
MyClass::new called
MyClass::DESTROY called
Fall off the end of the script...
MyClass::DESTROY called
MySubClass::DESTROY called

Perl - 面向对象 - 无涯教程网无涯教程网提供 Perl中的面向对象概念很大程度上基于引用以及匿名数组和哈希。让我们开始学习面向对...https://www.learnfk.com/perl/perl-object-oriented.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/21845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EditPlus取消自动.bak备份

Tools->Preferences->File 将√取消

Vulnhub靶机DC-2 writeup

靶机介绍 靶机介绍:https : //download.vulnhub.com/dc/DC-2.zip ​ 信息搜集 获取IP地址 扫描靶机的IP的方法 1. nmap -sP 192.168.142.0/24 #nmap进行ping扫描发现存活主机 2. arp-scan -l #基于ARP发现内网存活主机 3. netdiscover -r 192.168.142.0/24 -…

qt富文本编辑基本知识(QTextBlockFormat、QTextListFormat)

可以参考该文章:QTextBlockFormat、QTextListFormat - 程序员大本营 核心知识如下: 如果想开发一个富文本编辑器(html,markdown等常见格式),Qt已经为用户完成了几乎所有与编辑有关的具体工作,…

uniapp android底部弹框

uniapp android底部弹框&#xff0c;带有动画效果 <view class"popup_box"><view class"bottom_more" click"handleClickCancel"><image src"/static/images/rescue/icon_more.png"></image></view><…

AutoDL从0到1搭建stable-diffusion-webui

前言 AI绘画当前非常的火爆&#xff0c;随着Stable diffusion&#xff0c;Midjourney的出现将AI绘画推到顶端&#xff0c;各大行业均受其影响&#xff0c;离我们最近的AI绘画当属Stable diffusion&#xff0c;可本地化部署&#xff0c;只需电脑配备显卡即可完成AI绘画工作&…

Git常见问题

git clone 提示OpenSSL SSL_read git clone 时提示Connection was reset, errno 10054类错误 fatal: unable to acce ss https://github.com/fex-team/ueditor.git/: OpenSSL SSL_read: Connection was reset, errno 10054 备注&#xff1a;以下方法只是归纳整理&#xff0c;…

使用事件侦听器和 MATLAB GUI 查看 Simulink 信号研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

仓库管理系统有哪些功能,如何对仓库进行有效管理

阅读本文&#xff0c;您可以了解&#xff1a;1、仓库管理系统有哪些功能&#xff1b;2、如何对仓库进行有效管理。 仓库是制造业的开端&#xff0c;原材料的领料开始。企业的仓库管理是涉及企业生产、企业资金流和企业的经营风险的关键环节。在众多的工业企业、制造型企业、贸…

Linux 安装软件 - yum工具

在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行…

FFmpeg下载安装及Windows开发环境设置

1 FFmpeg简介 FFmpeg&#xff1a;FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。项目的名称来自MPEG视频编码标准&#xff0c;前面的"FF"代表…

mysql函数及用法

目录 一、前言 二、函数 2.1五大聚合函数 2.2 日期函数 3.字符串函数 三. 总结&#xff1a; 一、前言 mySQL 是一种常见的关系型数据库管理系统&#xff0c;提供了大量的函数可以帮助开发者有效地操作和管理数据库。mySQL根据这些函数将数据更好的进行操作&#xff0c;从…

《向量数据库》——怎么安装向量检索库Faiss?

装 Faiss 以下教程将展示如何在 Linux 系统上安装 Faiss: 1. 安装 Conda。 在安装 Faiss 之前,先在系统上安装 Conda。Conda 是一个开源软件包和环境管理系统,可在 Windows、macOS 和 Linux 操作系统上运行。根据以下步骤在 Linux 系统上安装 Conda。 2. 从官网…

Python:Spider爬虫工程化入门到进阶(1)创建Scrapy爬虫项目

Python&#xff1a;Spider爬虫工程化入门到进阶系列: Python&#xff1a;Spider爬虫工程化入门到进阶&#xff08;1&#xff09;创建Scrapy爬虫项目Python&#xff1a;Spider爬虫工程化入门到进阶&#xff08;2&#xff09;使用Spider Admin Pro管理scrapy爬虫项目 本文通过简…

MySQL 重置root 密码

5.7 版本 首先要把服务mysql57 关闭 net stop MySQL57 在安装的mysql57的程序的bin中 运行cmd&#xff08;管理员运行&#xff09; mysqld --defaults-file‘mysql存放数据的位置\my.ini’ --skip-grant-tables 上图 错误 注意&#xff1a;如果遇到mysqld: Can’t change dir…

大数据之Hadoop(一)

目录 一、准备三台服务器 二、虚拟机间配置免密登录 三、安装JDK 四、关闭防火墙 五、关闭安全模块SELinux 六、修改时区和自动时间同步 一、准备三台服务器 我们先准备三台服务器&#xff0c;可以通过虚拟机的方式创建&#xff0c;也可以选择云服务器。 关于如何创建虚…

MySQL最终弹-并发(脏读,不可重复读,幻读及区别),JDBC的使用和安装,最全万字

一、&#x1f49b;并发基本概念 并发的基本意思&#xff1a; 什么是并发呢&#xff1f;简单的理解就是同一时间执行 服务器同一时刻&#xff0c;给多个客户端提供服务&#xff5e;&#xff5e;&#xff0c;这两个客户端都可以给服务器提交事务。 如果提交两个事务&#xff0c;改…

Linux安装操作(Mac版本)

Parallels Desktop的简介 Parallels Desktop是Mac平台上的虚拟机软件&#xff0c;也是Mac平台最好的虚拟机软件之一。它允许用户在Mac OS X系统上同时运行其他操作系统&#xff0c;例如Windows、Linux等。Parallels Desktop为Mac用户提供了使用其他操作系统和软件的便利性&…

【ASP.NET MVC】使用动软(三)(11)

一、问题 上文中提到&#xff0c;动软提供了数据库的基本操作功能&#xff0c;但是往往需要添加新的功能来解决实际问题&#xff0c;比如GetModel&#xff0c;通过id去查对象&#xff1a; 这个功能就需要进行改进&#xff1a;往往程序中获取的是实体的其他属性&#xff0c;比如…

基于 JavaScript 的富文本编辑器框架简单使用

1.打开wangEditor wangEditor开源 Web 富文本编辑器&#xff0c;开箱即用&#xff0c;配置简单https://www.wangeditor.com/ 2.html文件 <link href"https://unpkg.com/wangeditor/editorlatest/dist/css/style.css" rel"stylesheet"> <style&…

直播预告 | 开源运维工具使用现状以及可持续产品的思考

运维平台自上世纪90年代开始进入中国市场&#xff0c;曾形成以传统四大外企&#xff1a;IBM、BMC、CA、HP为代表的头部厂商&#xff0c;还有一众从网管起家的国内厂商。2010年前后&#xff0c;出现了以Zabbix、Nagios、Cacti为代表的开源工具&#xff0c;后来又陆续出现了Prome…