🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
《C语言》 | 本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
《网络协议》 | 本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
《docker容器精解篇》 | 全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
《linux系列》 | 本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
《python 系列》 | 本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
《试题库》 | 本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
⛳️ 推荐
专栏介绍
1. 基本概念
2. 简单示例
定义类(Person.pm):
使用类(main.pl):
3. 继承
子类(Employee.pm):
使用继承:
4. 现代 Perl OOP 模块
Moose(功能完整):
Moo(轻量级 Moose 兼容):
5. 关键点总结
6. 何时使用
示例:完整现代 OOP(Moo)
进阶主题
Perl 的面向对象编程(OOP)基于包(package)和引用(reference),通过 bless 操作将引用与类关联。以下是核心概念和示例:
1.基本概念
类:一个包(package),包含数据和方法。
对象:被祝福(bless)的引用(通常是哈希引用)。
方法:类的子程序,第一个参数为对象或类名。
2.简单示例
定义类(Person.pm):
package Person; # 类名 use strict; use warnings; # 构造函数 sub new { my ($class, $name, $age) = @_; my $self = { name => $name, age => $age, }; bless $self, $class; # 将引用与类关联 return $self; } # 实例方法 sub get_name { my $self = shift; return $self->{name}; } sub set_name { my ($self, $name) = @_; $self->{name} = $name; } sub get_age { my $self = shift; return $self->{age}; } sub set_age { my ($self, $age) = @_; $self->{age} = $age; } sub info { my $self = shift; return "Name: $self->{name}, Age: $self->{age}"; } 1; # 包必须返回真值使用类(main.pl):
use strict; use warnings; use Person; # 加载类 my $person = Person->new("Alice", 30); # 创建对象 print $person->info(), "\n"; # 调用方法 $person->set_age(31); print "New age: ", $person->get_age(), "\n";3.继承
通过@ISA数组指定父类:
子类(Employee.pm):
package Employee; use strict; use warnings; use base 'Person'; # 继承 Person # 扩展构造函数 sub new { my ($class, $name, $age, $job) = @_; my $self = $class->SUPER::new($name, $age); # 调用父类构造 $self->{job} = $job; return $self; } # 新增方法 sub get_job { my $self = shift; return $self->{job}; } # 重写方法 sub info { my $self = shift; my $info = $self->SUPER::info(); # 调用父类方法 return "$info, Job: $self->{job}"; } 1;使用继承:
use Employee; my $emp = Employee->new("Bob", 25, "Engineer"); print $emp->info(), "\n"; # 输出:Name: Bob, Age: 25, Job: Engineer4.现代 Perl OOP 模块
传统方式较底层,推荐使用现代模块:
Moose(功能完整):
package Person; use Moose; has 'name' => (is => 'rw', isa => 'Str'); has 'age' => (is => 'rw', isa => 'Int'); sub info { my $self = shift; return $self->name . " is " . $self->age . " years old"; } __PACKAGE__->meta->make_immutable; # 优化性能 1;Moo(轻量级 Moose 兼容):
package Person; use Moo; has name => (is => 'rw'); has age => (is => 'rw'); sub info { my $self = shift; return $self->name . ", " . $self->age; } 1;5.关键点总结
传统方式 | 现代方式(推荐) |
|---|---|
手动 bless 哈希引用 | 使用 Moose/Moo 定义属性 |
通过 @ISA 实现继承 | 通过 extends 关键字继承 |
访问器需手动编写 | 自动生成访问器(is => 'rw') |
无类型检查 | 支持类型约束(isa => 'Int') |
6.何时使用
小型脚本/遗留代码:传统 bless 方式。
新项目:使用Moo(轻量)或Moose(功能全)。
性能关键:考虑Moo 或Class::Accessor。
示例:完整现代 OOP(Moo)
# File: Person.pm package Person; use Moo; use namespace::clean; has name => (is => 'rw', required => 1); has age => (is => 'rw', default => sub { 20 }); sub greet { my $self = shift; return "Hi, I'm " . $self->name; } 1; # 使用: use Person; my $p = Person->new(name => "Carol"); print $p->greet;进阶主题
角色(Role):类似接口/混入(Moose::Role)。
多继承:通过
@ISA = ('Class1', 'Class2')。私有方法:约定以
_开头(非强制)。
Perl OOP 灵活但需注意代码规范。建议新项目从Moo 开始,平衡功能和简洁性。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙