Perl 构造函数和析构函数
构造函数 **在Perl子程序中的构造函数会返回一个对象,它是该类的一个实例。在Perl中,惯例是将构造函数命名为 **”new “。与其他许多 OOPs 不同,Perl没有为构造一个对象提供任何特殊的语法。它使用与该类明确相关的数据结构(哈希、数组、标量)。
构造函数在哈希引用和类名(包的名称)上使用 “祝福 “函数。
让我们设计一些代码来进行更好的解释:
注意: 由于使用了包,下面的代码将不能在Online IDE上运行。下面的代码是一个Perl类或模块文件。将下面的文件保存为(*.pm
)扩展名。
# Declaring the Package
package Area;
# Declaring the Constructor method
sub new
{
return bless {}, shift; # blessing on the hashed
# reference (which is empty).
}
1;
当构造函数方法被调用时,包名’Area’被存储在默认数组 “@_ “中。关键字 “shift “用于从 “@_ “中获取包的名称,并将其传递给 “bless “函数。
package Area;
sub new
{
my class = shift; # defining shift inmyclass
my self = {}; # the hashed reference
return blessself, $class;
}
1;
Note : “my “限制了一个变量的范围。
在Perl中,属性是以散列引用中的键、值对的形式存储的。进一步说,在代码中加入一些属性。
package Area;
sub new
{
my class = shift;
myself =
{
length => 2, # storing length
width => 3, # storing width
};
return bless self,class;
}
1;
上面的代码( 区域 类)有两个属性: 长度 和 宽度。 为了获得对这些属性的访问,设计了另一个Perl程序来使用它们。
use strict;
use warnings;
use Area;
use feature qw/say/;
# creating a new Area object
my area = Area->new;
sayarea->{length}; #print the length
say $area->{width}; # print the width
运行代码的步骤 。
- 将带有Package Area的程序保存在一个名为 Area.pm 的文本文件中
注意: 文件的名称应始终与包的名称相同。 -
现在,用
*.pl
的名字保存用于访问包中定义的属性的程序。这里,*可以是任何名字(在本例中是test.pl)。 -
在Perl命令行中使用
perl test. pl命令来运行保存为test.pl的代码。
输出:
传递动态属性 :
用动态属性更新现有文件。
Areas.pm
package Area;
sub new
{
my (class,args) = @_; # since the values will be
# passed dynamically
my self =
{
length =>args->{length} || 1, # by default the value is 1 (stored)
width => args->{width} || 1, # by default the value is 1 (stored)
};
return blessself, class;
}
# we have added the get_area function to
# calculate the area as well
sub get_area
{
myself = shift;
# getting the area by multiplication
my area =self->{length} * self->{width};
returnarea;
}
1;
test.pl
use strict;
use warnings;
use feature qw/say/;
use Area;
# pass length and width arguments
# to the constructor
my area = Area->new(
{
length => 2, # passing '2' as param of length
width => 2, # passing '2' as param of width
});
sayarea->get_area;
现在,Params
length = 2, width = 2
被传递给包Area,以计算正方形的面积。
当任何子程序被调用时,参数都包含在默认的数组变量 @_ 中。
注意: 现在按照上面解释的方式运行代码。
输出:
解构器
当一个对象的所有引用超出范围时,Perl会自动调用析构器方法。如果该类创建的线程或临时文件在对象被销毁时需要清理,那么析构器方法就有用处了。Perl包含了一个特殊的方法名,即 ‘DESTROY ‘,用于销毁器,必须在销毁器声明时使用。
语法
sub DESTROY
{
# DEFINE Destructors
my $self = shift;
print "Constructor Destroyed :P";
}
Once this snippet is added to existing file **Area.pm**.
输出将有点像这样: