Perl5的OOP学习笔记

从VSCode到SES:HPM6750双核RISC-V开发迁移实战指南 嵌入式开发中,IDE选型直接影响开发效率。VSCode凭借丰富的插件生态成为通用代码编辑器的首选,但在MCU开发链路上,编译器、调试器、烧录工具各自为战,配置繁琐且排查困难。SES作为SEGGER官方IDE,深度整合编译、下载、调试全流程,并为HPM6750等RISC-V芯片提供定制化工程与免费License,从原理上契合芯片厂商与IDE厂商的生态协作逻辑,能显著降低工具链门槛、缩短开发周期。本文面向嵌入式开发工程师,从工具链整合角度切入,介绍SES激活、工程导入、J-Link连接及常见报错排查方法,并结合 阅读详情

  在Perl排名持续下降的情况下学Perl,似乎是有点不明智。但是,工作需要,不得不学啊。再说,Perl现在在测试领域还是用得非常多的。Phython虽然也在测试领域开始活跃起来,不过我始终还是不太喜欢Phython的语法。

  在学习了Perl的基本语法之后,学习Perl的OOP,略有心得。不知道Perl各个版本之间OOP是否有区别,但是我是学习的Perl5,所以在标题上将版本号也写出来了。因为了解到PHP4和PHP5的OOP部分就有不小的差别,所以有此担心。

  学习Perl的OOP,最关键的两件事情就是package和bless。只要把这两个东西搞清楚也就学会大一半了。

Perl的package

  感觉Perl的package和Java还真有点相似。Java的package是以CLASSPATH中的目录为根,按目录定义和搜索分级包名。Perl也类似,是以@INC数组中的目录为根,按目录搜索分级包名。不过有一点不同,Perl的package定义貌似不需要与目录结构对应。具体是什么样的规则我没有去研究,因为按目录结构定义package是个好习惯。

  相较于Java,Perl的package还有一点很有意思。Java的每层package对应一个目录,而最后是一个class文件对应到类名。Perl却简化了,package直接就把目录和文件名都引用了进去。比如

  Java中,name.jamesfancy.MyClass,对应的是/name/jamesfancy/MyClass.class,源代码中则分成两句来写

  Perl中,name::jamesfancy::MyClass,应对的是/name/jamesfancy/MyClass.pm,源代码中只有一句package就说明了

   至于package中的内容,也就是变量和子程序,至于区别,稍后再说。

bless函数

  bless是用来把一个类绑定到引用类型变量的函数。很奇怪Perl为什么要用这个单词,不过没关系,我们可以把它想像得形象一点:就像游戏里牧师通过祝福技能为某人加上BUFF一样,bless把一个类绑定到某个引用类型的变量,从此这个变量就受到了祝福,拥有了这个类中的变量和子程序。

  bless的用法通常是:bless($引用变量, 类名);

  引用变量貌似可以是任何引用类型的变量,我尝试过Scalar,Array和Hash的引用,都能成功。在bless之外,这个引用变量就可以被称之为对象了,当然它仍然是个引用,是对象的引用。

  有一点还需要注意,虽然这个对象拥有了类的变量和子程序,但我们应该把它拥有的类的变量和子程序都看成是静态的,换句话说,就是类的成员。在这一点上,子程序的处理会比较特殊一点,但至少类的变量,也就是包变量,是不属于对象的。因此,所有对象的数据都保存在对象引用的原始数据中。既然大家都习惯对象数据以键值对的方式保存,所以通常情况下,bless的引用变量,都是Hash的引用了。

  很抽象么?举个例子。如果对OOP的成员函数还不够了解,那就只看下面示例中每个类的test函数中第一句以后的内容不好。

  从上面的示例中可以看到,分别将3种类型的引用转变为对象。之所以要把类写成3个而非1个,主要是为了在Test里输出不同类型的数据。

类和对象的成员函数

  成员函数就是在package中定义的子程序。成员函数是没有静态和非静态之分的,但我宁愿大家都把它看作是静态函数,因为虽然它即可以当作类成员函数来调用,也可以当用对象成员函数来调用,但在当作对象成员函数来调用的时候,Perl偷偷的传入了对象引用。这也解释了为什么通常成员函数里的第一句话往往是

  当然,这里的$this只是一个局部变量,而不是关键字,你也可以用别的名称来代替它。比如很多人就喜欢用$self,或者$me等。

  假如,对于一个成员函数,分别用类和对象来对它进行调用,会有什么不一样呢?再看一个示例:

  从结果可以看出来,不管哪种方法调用,第一个参数都是Perl偷偷传递进去的。如果是类调用,则第一个参数是该类。如果是对象调用,第一个参数是该对象。因此,只需要将ref($this)的结果和类名进行比较就清楚是哪种调用了。所以,一个容错性较好的成员函数,一开始要判断传入的第一个参数,比如

  这里还有一个疑问:既然package中定义的子程序都是成员函数,那不是类的package和是类的package有啥区别?它们在结构上没有一点区别,唯一的区别在处理中。在调用子程序的时候,Perl不会硬塞一个类或者对象在参数列表的最前面,但调用成员函数的时候会,所以区别是根据你的调用方式来区分的。

  调用对象成员还好说,$obj->foo()就好,但是调用类成员的时候,怎么知道是调用的类成员还是包中的子程序呢?那就要看是通过“->”还是“::”来调用的了。下面的例子可以帮助理解:

  很明显,通过“::”调用的子程序没有被Perl塞入一个引用类的参数。

构造函数

  Perl的OOP没有指定专门的构造函数,所以你可以把任何一个子程序当作构造函数,当然,重要的是其中的内容。既然脚本通常不是写给自己一个人看的,所以还是按照大家的习惯,把构造函数取名为new吧。按照多数OOP语言的习惯,new函数通常返回一个对象或其引用、指针。所以在Perl中,这个new函数要返回一个对象引用,理所当然地,把bless动作包含在new函数中是个好习惯。那么一个简单的new函数看起来就像这样:

  这个new函数中产生了一个Hash引用,bless它,并返回它。如果你疑惑为什么这里没有看到return语句,那么建议你去看看关于子程序中返回值的资料,顺便查一下bless函数的说明。来看看完整的程序了解一下是怎么使用new函数的。

  注意上面new MyClass()的效果和MyClass->new()效果是一样的。这里new不是关键字,而是函数名。同理,如果有一个foo成员函数的话,也可以foo MyClass(args),它实际上是MyClass::foo(MyClass, args);

  话说回来,如果需要初始化对象数据又该如何呢?前面说过,对象数据保存在引用的数据自身,所以我们通常是把一个Hash引用bless成对象。所以我们经常会看到这样调用new:

  或者

  两种调用方式的区别在于new函数中的处理不同,因为前者传入的是一个Hash实体,而后者传入的是一个Hash引用。为了兼容这两种情况,new函数通常会像下面程序中的写法:

访问对象数据

  既然通常是Hash引用被bless成对象,那就只说这种情况。

  既然是Hash引用,所以访问数据最简单的办法就跟访问Hash引用一样。比如

  如果想少写点花括号,可以通过定义setter/getter的办法来解决。因为getter和setter可以根据有没参数来区分,所以合并在一个函数中成为可能,比如下面的name函数

  使用setter/getter的确可以使程序看起来简洁不少。但是对对象中的每个数据写一个getter/setter,还是很累人的,于是,AUTOLOAD函数就被抬出来了,看看下面的程序

  这样调用起来是不是方便多了?不过AUTOLOAD写起来很累人的。如果你只需要一个数据对象,网上有个Hash::AsObject的类很好用,用法和上面的最后一个示例差不多。

继承

  我的确是对继承这个方面没怎么研究。不过简单的继承大概就是用use base语句引入基类而已,比如

参考资料

东南大学出版社出版,O'Reilly的《精通Perl(影印版)》,brian d foy著
Perl version 5.10.0 documentation,http://perldoc.perl.org/
Hash::AsObject源码,来自http://search.cpan.org/~nkuitse/Hash-AsObject-0.11/lib/Hash/AsObject.pm

Perl中foreach循环变量 看下面代码: #!/usr/bin/perl -w my $x = 1; for $x (5 ... 8){ print "In the for loop, \$x=[$x]\n"; } print "\nOut of for loop, \$x=[$x]\n"; [/perl] 输出结果如下: [perl] $ ./test.pl In the for loo 阅读详情

相关推荐

数字IC验证:Perl快速入门

写在前面: 最近实习需要学习perl的基础知识,由于目前只需要了解perl基本语法,看懂即可,不做深入学习,因此写下本文,用于Perl快速入门。 内容主要来源:优快云@David_Berkdong 《Perl与Python之间的一些异同》 文章目录1 Perl的基本数据类型2 Perl流程控制语句2.1 if 判断语句2.2 unless判断语句2.3 for 循环语句2.4 while 循环语句2.5 循环控制符3 Perl的函数4 Perl的包与模块5 Perl的OOP6 Perl正则表达式 1 .

IC Beginner的博客 2178

perl中bless的理解(zz) z

bless有两个参数:对象的引用、类的名称。类的名称是一个字符串,代表了类的类型信息,这是理解bless的关键。所谓bless就是把 类型信息 赋予 实例变量。程序包括5个文件:person.pm :实现了person类 dog.pm :实现了dog类 bless.pl : 正确的使用blessbless.wrong.pl : 错误的使用blessbless.cc : 使用C++

1153

Nginx健康检查实战:如何用第三方模块提升服务可用性(附详细配置)

本文深入探讨了如何通过集成第三方健康检查模块来提升Nginx的服务可用性。文章对比了Nginx默认被动检查的局限性,并详细介绍了主动健康检查的核心优势、主流模块选型,以及以nginx_upstream_check_module为例的实战部署与配置指南,帮助运维人员构建更可靠的负载均衡架构。

weixin_28331555的博客 308

Linux下安装Perl 5

  在安装openssl时需要安装Perl5,否则报一下错误。 Operating system: x86_64-whatever-linux2 You need Perl 5. 安装Perl 5的执行步骤为: ####需要安装 perl-5https://www.cpan.org/src/README.html wget https://www.cpan.org/src/5.0/p...

开心程序猿 1万+

VMware ESXi 7.0下Intel网卡SR-IOV配置实战:解决虚拟化网络延迟问题

本文详细介绍了在VMware ESXi 7.0环境下为Intel网卡配置SR-IOV(单根I/O虚拟化)的完整实战流程。通过硬件辅助直通技术,虚拟机可直接访问物理网卡资源,有效绕过虚拟化层瓶颈,从而显著降低网络延迟和CPU开销,适用于金融交易、实时计算等对性能敏感的场景。

embedding5hiker的博客 553

Spring Boot日志可视化实战:5分钟搞定Promtail采集与Grafana查询(避坑指南)

本文详细介绍了如何通过Promtail和Grafana实现Spring Boot日志的可视化查询,提供从日志采集到高效查询的全流程实战指南,重点解决部署中的常见问题。内容包括Logback配置、Promtail日志采集、Grafana的LogQL查询技巧及生产环境优化建议,帮助开发者快速定位和解决日志问题。

weixin_42526015的博客 106

perl OOP

<br />构造了类的一个对象后,可以使用箭头运算符来调用对象的方法。<br />objectName ->method(arguments)<br /> <br />例如使用FileHandle类<br /><br />#! /use/bin/perl<br />#Using the FileHandle module<br /> <br />use warnings;<br />use strict;<br />use FileHandle;<br /> <br />my $write = new Fi

doudou8486的专栏 849

瑞数6.5逆向实战:手把手教你用RPC搞定cookie sign加密(附环境补全技巧)

本文深入解析瑞数6.5逆向实战,重点探讨如何结合环境补全与RPC调用技术来应对其动态加密机制。文章详细介绍了环境指纹采集、双重验证等核心防护原理,并提供了基于Puppeteer的RPC实现方案,手把手教你搞定cookie sign加密,附有实用的环境补全技巧与完整代码示例。

weixin_29315091的博客 1273

Perl 5 编程语言完整指南:从入门到精通

Perl 5 是一种功能强大的通用编程语言,最初为文本处理而设计,现在广泛应用于系统管理、Web开发、网络编程、GUI开发等多个领域。这门语言注重实用性,支持过程式编程和面向对象编程,拥有强大的内置文本处理功能,以及世界上最丰富的第三方模块库。 Perl 以其"不止一种方法来做同一件事"的座右铭而闻名,为开发者提供了极大的灵活性和表达力。🎯 ## 🌟 Perl 5 的主要特性 Perl

gitblog_00577的博客 588

[机器学习] 第二章 模型评估与选择 2.ROC:roc_curve原理及源代码详解

代码见:https://github.com/Carrie-Yi/machine_learning/tree/main/roc_curve

心宝的博客 1493

10倍开发者的 Dify 魔法书:从零构建全栈 AI 应用

“不懂底层算法,也能开发爆款 AI 应用吗?” 答案是:绝对可以。 Dify 正在重新定义 AI 应用的开发范式——通过可视化的低代码平台,将原本需要数周的开发周期压缩到几小时。无论你是前端、后端、产品经理,还是渴望破局的独立开发者,这都是你不可错过的红利。 我们将手把手教你利用 Dify 快速接入百模大战,零代码搭建企业级知识库,并一键发布你的专属 AI 助手、智能客服和自动化工作流。 告别重复造轮子,掌握 Dify,一个人就是一支 AI 团队。现在上车,开启你的 10 倍速开发之旅!

davidwang456的专栏 682

Roc 编译器中的 crash 语句与省略号占位符:从快照测试看其词法、语法、规范化与诊断全流程

本指南以 Roc 语言编译器仓库中的快照测试文件 [test/snapshots/crash_and_ellipsis_test.md](https://link.gitcode.com/i/8bbd5459ff32f2601250f567c41e6863) 为骨架,深入剖析 Roc 中两个极易混淆的语言特性——`crash` 崩溃语句与 `...`(ellipsis)未实现占位符——在编译器各阶

gitblog_00013的博客 861

什么是华为OD?怎么才能通过华为OD机试?华为OD机试怎么刷题?(2024最新华为OD机试E卷更新中)

华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 11万+

Perl OOP

1. 模块/类(包) 创建一个名为Apple.pm的包文件(扩展名pm是包的缺省扩展名。意为Perl Module)。 一个模块就是一个类(包)。 2. new方法 new()方法是创建对象时必须被调用的,它是对象的构造函数。 sub new { my $class = shift; my $this = {}; bless $t...

aodiyi6351的博客 158

国科大学习资料--高级软件工程-复习题选择题答案

国科大学习资料–高级软件工程(罗铁坚 魏峻 刘丹)-复习题选择题答案 ’‘

无名何许人的博客 1165

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

HoRain云--Perl OOP编程

本文介绍了Perl面向对象编程(OOP)的核心概念与实现方式。主要内容包括:1)传统OOP实现,通过bless操作将引用与类关联,定义类、构造函数和实例方法;2)继承机制,使用@ISA数组和父类方法调用;3)现代OOP模块Moose和Moo的使用,支持自动生成访问器和类型约束;4)关键点对比传统与现代实现方式的差异;5)应用场景建议,小型脚本使用传统方式,新项目推荐Moo/Moose。文章还提供了完整代码示例,并提及进阶主题如角色、多继承等。建议新项目从轻量级的Moo开始,兼顾功能与简洁性。

2401_86544677的博客 421

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

perl调用其他的perl_如何使Perl更优雅

perl调用其他的perl 这是关于将代码从Perl 5迁移到Perl 6 的系列文章中的第七篇 。本文着眼于如何在Perl 6中创建类(对象)以及它与Perl 5的区别。 Perl 5具有非常基本的面向对象形式,您可能会认为这是事后才想到的。 为了改善这种情况,已经进行了几次尝试,其中最著名的是Moose ,它“很大程度上基于Perl 6对象系统,并且借鉴了CLOS,Smalltalk和许...

cuml0912的博客 865

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

第 7 章 Perl OOP

目录 7.1. Moose - A postmodern object system for Perl 5 Person.pm package Person;s use strict; sub new { my $self = {}; $self->{NAME} = undef; $self->{AGE} = undef;...

weixin_34362875的博客 141

PERL5 —— 面向二十一世纪的语言

这是SUN微系统公司(http://soldc.sun.com)面向广大开发人员进行的一个在线调查结果。 您使用什么语言来开发基于WEB的客户端应用程序? Perl 62.1% JSP 12.5% PHP 8.7% C, C++ 7.1% ASP 5.7% 其它 3.7% PERL 编程语言的设计者 Larry Wall把PERL称为后现代语言,它的目的不是要推出一种新的风潮,而是集各种语言的优势

讲武堂-Jiangtao 2860

Perl语言的面向对象编程

在Perl中,类通常是一个包(package)。通过package关键字定义类,并使用new方法来构造对象。以下是一个简单的类定义示例:```perlsub new {# 将对象引用与类关联sub bark {1;# 包的结束符```在上面的示例中,Dog是一个类,有两个属性name和age。new方法用于创建新的对象,而bark方法则是一个实例方法,用于打印狗的名字。面向对象编程为Perl语言带来了结构化和模块化的能力,使得代码更易于维护和扩展。明确类的责任。

2401_90032043的博客 983

什么是OOP思想?

什么是OOP思想?

weixin_73756660的博客 347
上一篇: C++中简单实现foreach循环
下一篇: JQuery初体验
边城狂人
博客等级 码龄23年 139粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值