🎬 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)

进阶主题


img

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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐