(相当于python的类)
建一个:/mnt/lustre/user/wubin/01.Program/Scripts/01.script/GeneLab/package/test.pm
#!/usr/bin/perl -w
package package::test;
require Exporter;
use strict;
use warnings;
use File::Basename;
our @ISA = qw(Exporter);
our @EXPORT = qw(add2,add); #这里添加了add2,add2就可以直接使用,而不必带包名或对象名
our @version = 1.0;
sub new{
my ($class,$file) = @_;
my $self = bless {}, $class;
return $self;
}
sub add{
my ($self, $a, $b) = @_;
my $c = $a + $b;
return($c);
}
sub add2{
my ($a, $b) = @_;
my $c = $a + $b;
return($c);
}
1;
再建一个 b.pl脚本:
$cat b.pl
#!/usr/bin/perl -w
use strict;
use lib '/mnt/lustre/user/wubin/01.Program/Scripts/01.script/GeneLab';
use package::test;
my $object = package::test->new(); #这个过程相当于python里面类的实例化
my $c = $object->add(3,2);
print "$c\n";
再建一个c.pl
#!/usr/bin/perl -w
use strict;
use lib '/mnt/lustre/user/wubin/01.Program/Scripts/01.script/GeneLab';
use package::test;
my $object = bless {}, 'package::test';
my $c = $object->add(3,2);
print "$c\n";
可以看出,b.pl 和c.pl是一样的。 一个在包里面bless,一个在外面脚本(c.pl)里bless。
不过一般b.pl这种方式更好
再建一个d.pl:
#!/usr/bin/perl -w
use strict;
use lib '/mnt/lustre/user/wubin/01.Program/Scripts/01.script/GeneLab';
use package::test;
my $object = package::test->new();
my $c = add2(3,2);
print "$c\n";
注意,$object = bless {}, "package::test"之后,
$object->add(3,2) 相当于 package::test->add(3,2)
也相当于package::test::add('package::test',3,2)
也就是说,'->'调用方式,第一个参数是对象本身,这个参数是隐含的。
而package::test::add这种调用方式,则没有隐含的第一个参数。
注意,d.pl中,可以直接用add2(3,2), 却不能直接用add(3,2),
即使在package/test.pm中的@EXPORT中添加了add,也不能使用。
原因是add方法要求有3个参数。
sub add{
my ($self, $a, $b) = @_;
my $c = $a + $b;
return($c);
}