无涯教程-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
相关文章:
无涯教程-Perl - 面向对象
Perl中的面向对象概念很大程度上基于引用以及匿名数组和哈希。让我们开始学习面向对象Perl的基本概念。 定义类 在Perl中定义一个类非常简单。类以最简单的形式对应于Perl软件包。要在Perl中创建一个类,我们首先构建一个包。 Perl软件包在Perl程序中提供了一个单…...
Linux安装VScode
从本篇开始,打算有时间就写写在VScode中编写一些ros相关的案例程序用于学习记录。本篇是如何在Linux安装VScode的第一篇。 一、下载VScode 在Linux中打开浏览器输入:https://code.visualstudio.com/Download,选择与你电脑相匹配的版本下载&…...
网络安全(黑客)工具篇
大家好,我是白菜。这篇文章给大家盘点那些年,我们一起玩过的网络安全工具。 一、反恶意代码软件 1.Malwarebytes 这是一个检测和删除恶意的软件,包括蠕虫,木马,后门,流氓,拨号器,…...
测试工程师刚入职如何快速熟悉需求并输出测试用例?
刚入职第一天,早上办完入职,下午就就分配了测试任务,2个模块13条短信验证,2天内输出测试用例(xmind输出功能点,excel书写业务流)。测试负责人给我们快速讲了一下业务,在这过程中大概…...
2023上半年手机及数码行业分析报告(京东销售数据分析)
2023年上半年,手机市场迎来复苏,同环比来看,销量销额纷纷上涨。 而数码市场中,各个热门品类表现不一。微单相机及智能手表同比去年呈现增长态势,而笔记本电脑市场则出现下滑。 基于此现状,鲸参谋发布了20…...
Opencv-C++笔记 (14) : 霍夫变换(直线、圆)
文章目录 一、霍夫变换-直线1.1霍夫变换-直线 原理详解 二、霍夫圆检测 一、霍夫变换-直线 Hough Line Transform用来做直线检测 前提条件 – 边缘检测已经完成 1、平面空间(x,y)到极坐标空间转换; 2、对极坐标进行变换,转化为…...
栈和队列(一) 栈操作详解
文章目录 一、物理结构和逻辑结构二、栈1、什么是栈2、栈中一些基本操作的实现Stack.hStack.c栈的初始化栈的销毁入栈出栈获得栈顶元素获得栈的元素数判断栈空 三、利用栈解决问题 一、物理结构和逻辑结构 栈和队列都属于逻辑结构,它们既可以用数组实现也可以用链表…...
软考A计划-系统集成项目管理工程师-信息系统安全管理-下
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…...
Spark知识点总结
1. Spark支持哪几种运行模式? 本地模式(Local Mode):在这种模式下,Spark在单个机器上运行。所有的Spark操作都在一个单独的JVM进程中进行。这种模式适合开发和测试,但不适合处理大规模的数据。 集群模式&a…...
vue el-input 使用 回车键会刷新页面的问题
场景: vue项目中 在输入框输入字符并按下回车键搜索时,不会进行搜索, 而是会刷新页面 原因: 当form表单中只有一个input时,按下回车建会自动触发页面的提交功能, 产生刷新页面的行为 解决: 在…...
【ARM64 常见汇编指令学习 12 -- ARM 汇编函数 的学习】
文章目录 1.1 ARM 汇编函数简介1.1.1 ARM 汇编标签 Label1.1.2 ARM 汇编函数属性指令1.1.3 UEFI 中的函数宏:ASM_FUNC1.1.3.1 UEFI ASM_FUNC 实现汇编函数 1.1.4 UEFI 预编译前缀宏 ASM_PFX 上篇文章:ARM64 常见汇编指令学习 11 – ARM 汇编宏 .macro 的…...
linux下软件安装 - 与GPT对话
1 cmake 没有uninstall 你是对的,CMake 默认情况下并没有提供 make uninstall 目标。这是因为 make install 操作是在特定的目录下进行安装的,CMake 不知道安装到了哪里以及哪些文件被安装了。因此,没有直接支持的 make uninstall 目标来进行卸载。 如果你想要卸载通过 mak…...
idea 2023 新版ui中git的相关操作
前两个月换了新电脑,下了最新版的idea发现可以切换一套新的ui了 切换新ui肯定不太习惯,很多操作都得重新摸索一下 在这里记录几个git相关的操作 忽略我下面截图中当前项目是js的后端项目…… 切换ui 首先说一下怎么切换新旧版ui,我这里就…...
vue3—SCSS的安装、配置与使用
SCSS 安装 使用npm安装scss: npm install sass sass-loader --save-dev 配置 配置到全局 🌟附赠代码🌟 css: {preprocessorOptions: {scss: {additionalData:import "./src/Function/Easy_I_Function/Echarts/ToSeeEcharts/utill.…...
Godot 4 源码分析 - Path2D与PathFollow2D
学习演示项目dodge_the_creeps,发现里面多了一个Path2D与PathFollow2D 研究GDScript代码发现,它主要用于随机生成Mob var mob_spawn_location get_node(^"MobPath/MobSpawnLocation")mob_spawn_location.progress randi()# Set the mobs dir…...
ardupilot 中坐标变换矩阵和坐标系变换矩阵区别
目录 文章目录 目录摘要1.坐标变换矩阵与坐标系变换矩阵摘要 本节主要记录ardupilot 中坐标变换矩阵和坐标系变换矩阵的区别,这里非常重要,特别是进行姿态误差计算时,如果理解错误,很难搞明白后面算法。 1.坐标变换矩阵与坐标系变换矩阵 坐标变换矩阵的本质含义:是可以把…...
VR内容研发公司 | VR流感病毒实验虚拟现实课件
由广州华锐互动开发的《VR流感病毒实验虚拟现实课件》是一种新型的教学模式,可以为学生提供更加真实和直观的流感病毒分离鉴定实验操作体验,从而提高学生的实验技能和工作效率。 《VR流感病毒实验虚拟现实课件》涉及了生物安全二级实验室(BSL-2)和流感病…...
python——案例10:认识if、elif、else
案例10:认识if、elif、elsenumfloat(input("输入数值:")) #用户输入数字if num>0:print("正数")elif num0:print("零") else:print("负数")#输出结果如下:输入数值:-1 负数 输入数值…...
Hadoop中命令检查hdfs的文件是否存在
Hadoop中命令检查hdfs的文件是否存在 在Hadoop中,可以使用以下命令检查HDFS文件是否存在: hadoop fs -test -e 其中,是要检查的HDFS文件的路径。 如果文件存在,命令返回0;如果文件不存在,命令返回非0值…...
计算机网络用户接入层设计
用户接入层为用户提供访问核心网络的能力, 为用户提供共享/交换的带宽分配,按照业主要求,并考虑到端口密度的要求以及 设备的性能价格比,建议选用 Catalyst 3524XL和 Catalyst 3548XL 工作组交换 机,分别放置于配线间中。如同一配线间需两台以…...
如何使用WiFiManager打造智能零售网络:从自助结账到智能货架的无缝配置方案
如何使用WiFiManager打造智能零售网络:从自助结账到智能货架的无缝配置方案 【免费下载链接】WiFiManager ESP8266 WiFi Connection manager with web captive portal 项目地址: https://gitcode.com/gh_mirrors/wi/WiFiManager 在现代零售环境中,…...
INS与GPS组合导航EKF算法代码功能说明
三维的组合导航。 ins和卫星的组合导航算法,基于卡尔曼滤波和eskf滤波的都有。 MATLAB源码,有kf和eskf的对比,也有单独的误差,或者输入滤波之后的位移速度等导航参数。 这段程序主要是一个卡尔曼滤波器,用于估计运动物…...
UE6.5调试性能对比实测:Clang 19 vs MSVC 17.12 vs GCC 14.2(C++27特性支持度+调试信息完整性双维度TOP1)
第一章:UE6.5 C27 调试能力演进与基准定位Unreal Engine 6.5 首次原生支持 C27 标准子集,并深度整合了 Clang 18 的调试元数据增强特性,显著提升了符号解析精度与运行时诊断能力。相比 UE5.4 中基于 DWARF-5 的有限 C20 支持,UE6.…...
佣金自动算、订单自动记,这才叫好系统
做推客、做分销、做私域小店,最磨人的从来不是拉新和卖货,而是没完没了的记账、对账、算佣金。人工统计订单、Excel 算佣金、靠截图核对业绩,不仅慢、容易错,还特别消耗信任。真正能让商家省心、让推客放心的好系统,标…...
5步解锁全球化内容生产:MoneyPrinterTurbo多语言视频创作全指南
5步解锁全球化内容生产:MoneyPrinterTurbo多语言视频创作全指南 【免费下载链接】MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频 Generate short videos with one click using AI LLM. 项目地址: https://gitcode.com/GitHub_Trending/mo/MoneyP…...
从零到上线仅需4步,Mojo调用Python生态的隐藏API全解密,内部技术白皮书首次公开
第一章:从零到上线仅需4步,Mojo调用Python生态的隐藏API全解密,内部技术白皮书首次公开Mojo 作为新一代系统级编程语言,原生支持无缝调用 Python 生态——但其关键能力并非来自 import 语句,而是通过未公开的 python 装…...
别再只比精度了!手把手教你用YOLOv5和v7在自定义数据集上做训练优化
别再只比精度了!手把手教你用YOLOv5和v7在自定义数据集上做训练优化 当你第一次在COCO数据集上跑通YOLOv5的demo时,那种"目标检测原来如此简单"的兴奋感可能还记忆犹新。但当你把模型迁移到自己的零件检测、农作物病害识别或零售商品分类任务时…...
GTE中文向量模型实战教程:基于test_uninlu.py扩展支持中文繁体与简体兼容测试
GTE中文向量模型实战教程:基于test_uninlu.py扩展支持中文繁体与简体兼容测试 1. 引言:当GTE模型遇上中文繁简转换 如果你正在使用GTE中文向量模型处理文本,可能会遇到一个不大不小的麻烦:用户输入的文本,有时是简体中…...
猫抓浏览器扩展:网页资源嗅探的终极解决方案与完整实施指南
猫抓浏览器扩展:网页资源嗅探的终极解决方案与完整实施指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字内容爆炸的时代&…...
告别重复造轮子:用快马平台生成mpu6050优化算法库,开发效率提升数倍
告别重复造轮子:用快马平台生成mpu6050优化算法库,开发效率提升数倍 在嵌入式开发中,MPU6050这款六轴传感器几乎成了运动控制和姿态检测的标配。但每次新项目都要从头写驱动、调滤波算法、实现姿态解算,这种重复劳动实在太低效了…...
