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
$