首页 > 编程语言 >Perl学习笔记1_面向对象语法

Perl学习笔记1_面向对象语法

时间:2023-07-15 12:22:12浏览次数:36  
标签:note person self Perl 语法 面向对象 my id pm

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

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

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函数, 并传给它参数.

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

#!/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
$ 

标签:note,person,self,Perl,语法,面向对象,my,id,pm
From: https://www.cnblogs.com/gaiqingfeng/p/17555936.html

相关文章

  • Jenkins pipeline(之Groovy语法简介)
    1.Jenkinspipeline编写风格:Jenkinsfile  声明式风格、脚本式风格  声明式:格式有强规范性(优势:可读性强。缺点:不灵活、代码冗长)  脚本式:使用groovy语言编写,灵活性高,可读性差。优点:实现自定义逻辑更方便、可对功能代码段封装为方法(函数)或类   2.流水线脚本结构n......
  • 面向对象
    要想面向对象,操作对象,首先便要拥有对象;要创建对象,必须要先定义类,所谓的类可以理解为对象的模型;程序中可以根据类创建指定类型的对象;举例来说:可以通过Person类来创建人的对象,通过Dog类创建狗的对象,不同的类可以用来创建不同的对象;定义类class类名{属性名:类型;......
  • SQL部分核心语法语句
    语法 关键字前加 --即为注释运算符(配合WHERE使用)·比较运算符:=等于,!=或<>不等于,>大于,>=大于等于,BETWEEN两值之间,IN一组值里,LIKE相似匹配 ·逻辑运算符:AND与,OR或,NOT或!非字符两边要加单引号('  ') 创建 (字母大小写均可,用大写作区分关键字与一般......
  • SQL常用语法
    SQL常用语法--创建表CREATETABLEemployees(employee_idNUMBER(6),first_nameVARCHAR2(20),last_nameVARCHAR2(25),emailVARCHAR2(25),phone_numberVARCHAR2(20),hire_dateDATE,job_idVARCHAR2(10),salaryNUMBER(8,2),commission......
  • 面向对象 第三部分 继承和多态
    classAnimal(object):defrun(self):print('Animalisrunning...')classDog(Animal):defrun(self):#继承的好处:多态print('Dogisrunning...')defeat(self):print('Eatingmeat...')classCat(An......
  • Oracle、MySQL、HQL的语法差异
    Oracle、MySQL、HQL查询语句的差异SQL是结构化查询语言,执行Select(选择)、Update(更新)、Delete(删除)和Insert(插入)等数据任务。关系数据库是指基于关系模型的数据库。在关系模型中,用于存储数据的逻辑结构就是二维表(Table)。表由行和列组成,行也称为记录,代表了单个实体;列也称为字段,代表......
  • 第二章 语法概览
    第二章就是大概讲了一下Go语法的东西,标识符、操作符、类型、流程控制、函数等等。任何类型都是实现了空接口空标识符—用来接收不需要用到的变量相比较别的语言,go天生支持高并发,在操作符里面也多了一个跟并发有关的,接收操作:<-类型断言:判断一个接口值得实际类型是否为某个实......
  • mysql-语法
    1、引号单引号、双引号,不加引号,反引号,以及任意的圆括号2、结尾(1);一般,在终端交互时,一条sql语句的末尾需要使用;结尾,才会执行,或者enter后跳行等待输入;基于;还可以在一行中写入多条sql语句,相互间隔,依次执行,即使其中一条出现问题,后续sql语句仍然执行对于非终端提交语句,比如代......
  • Prometheus 基础语法
    prometheus语法参考:https://blog.csdn.net/Happy_Sunshine_Boy/article/details/105651016CPU1.计算CPU的使用时间空闲CPU使用时间=node_cpu_seconds_total{mode=“idle”}CPU总共使用时间=node_cpu_seconds_total)2.取一分钟之内的使用增量空闲CPU一分钟内的增量:in......
  • Shell | 函数语法
    系统函数1、basename基本语法:basename[string/pathname][suffix](功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。basename可以理解为取路径里的文件名称选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string......