HoRain云--Perl OOP编程

🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
|
专栏名称 |
专栏介绍 |
|
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
|
|
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
|
|
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
|
|
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
|
|
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
|
|
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录

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: Engineer
4. 现代 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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)