perl学习笔记01_面向对象语法

面向对象语法

1. 说明

perl面向对象没有什么特别的语法, 以例子介绍如下.
例子中涉及三个文件: main.pl, AllPerson.pm, Person.pm.

其中:
main.pl是主脚本, 它要用到AllPerson.pm.
AllPerson.pm是一个class, 它要用到Person.pm.
Person.pm是一个class, 存储人员信息.

当使用某个目录下的module时,使用use lib,然后就可以使用 use xxx调用这个module了.
use lib "/path/xx"

new函数第一个参数是class.

new {
    my $object = $_[0];
    my $class = ref($object) || $object;
}

2. main.pl

#!/usr/bin/perl

use strict;
use warnings;

#push(@INC, "./");
use lib "."  ; #自定义的包路径
use AllPerson; #要用到AllPerson.pm

my $ref_all_person = [
    ["0109", "LiLei"    , 80,],
    ["0110", "HanMeimei", 81,],
    ["0111", "Jim"      , 59,],
];

my $all_person = new AllPerson($ref_all_person); #调用AllPerson的new函数, 并传给它参数.

3. AllPerson.pm

类文件名需要与类名相同, 需要以.pm做后缀, 文件内容以"1;"结尾.

#!/usr/bin/perl

package AllPerson; #类名(包名), 需要与文件名一致

use strict;
use warnings;

use lib "."; #自定义的包路径
use Person ; #需要用到Person.pm

sub new { # 类的new函数.
    # 第一个参数是$class,
    # 第二个及后面的参数是用户传进来的参数
    my ($class, $ref_all_person) = @_;

    my $self = { #是这实例的数据, new函数需要bless它, 并返回它
        person => [], #person这个key对应的是一个指向array的引用
    };

    bless $self, $class; # 可以认为是把$self(实例)与$class(类)绑定到一起

    #bless之后还可以调用method修改数据
    $self->{person} = $self->gen_person($ref_all_person);

    #打印数据
    foreach my $one_person (@{$self->{person}}){
        printf("%s\n", $one_person->to_string()); #调用Person.pm的方法

    }

    return $self; # new函数要返回$self
}

sub gen_person{
    #method的第一个参数是$self, 后面的参数为用户传入的参数
    my ($self, $ref_all_person) = @_;

    my $person = [];
    foreach my $ref_one_person (@{$ref_all_person}){
        my $one_person = new Person(@{$ref_one_person});
        push(@{$person}, $one_person);
    }
    return $person;
}

1; # .pm需要以这一行结尾

Person.pm, 文件名需要与类名相同, 需要以.pm做后缀

#!/usr/bin/perl

package Person;

use strict;
use warnings;

sub new{
    my ($class, $id, $name, $score) = @_;
    my $self = {
        id => $id,
        name => $name,
        score => $score,
        note => {}, #这个数据不是通过参数传来的, 需要自己处理生成
    };

    bless $self, $class; # 可以认为是把$self(实例)与$class(类)绑定到一起

    $self->{note} = $self->gen_note(); #处理生成 note

    return $self; # new函数要返回$self
}

sub gen_note{
    #method的第一个参数是$self, 后面的参数为用户传入的参数
    my ($self) = @_;

    my $note = {};

    #pass
    if ($self->{score} >= 60){
        $note->{pass} = 1;
    } else {
        $note->{pass} = 0;
    }

    #age
    if ($self->{id} =~ /(\d{2})$/){
        $note->{age} = $1;
    } else {
        $note->{age} = 0;
        printf("Error: id %s is not match /\\d\\d\$/", $self->{id});
    }

    return $note;
}

sub get_name{
    my ($self) = @_;
    return $self->{name};
}

sub to_string{
    my ($self) = @_;
    my $s = sprintf("id: %4s, name: %10s, score: %3s, pass: %1s, age: %2s",
        $self->{id},
        $self->{name},
        $self->{score},
        $self->{note}->{pass},
        $self->{note}->{age},
    );
    return $s;
}

1; # .pm需要以这一行结尾

运行结果:

$ perl main.pl
id: 0109, name:      LiLei, score:  80, pass: 1, age: 09
id: 0110, name:  HanMeimei, score:  81, pass: 1, age: 10
id: 0111, name:        Jim, score:  59, pass: 0, age: 11
$ 
posted @ 2023-07-15 12:12  编程驴子  阅读(11)  评论(0编辑  收藏  举报