请解释下面的Perl代码:
sub new {
my $class = shift;
my $self = {property => 'u', provider => 'ramesh'};
bless $self, $class;
return $self;
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*sen 28
它是Perl对象的构造函数.Perl对象可以由任何Perl引用构成.这个恰好是由哈希引用构成的({property => …}代码创建了一个哈希引用).请参阅perlobj联机帮助页.
通常你会在一个包中找到这样的代码,它是类及其实例的方法的容器:
package Foo;
sub new {
my $class = shift; # 2
my $self = {property => 'u', provider => 'ramesh'}; # 3
bless $self, $class; # 4
return $self; # 5
}
sub poll {
my ($self)=@_; # 7
$self->{CurrentFile}="data.xml"; # 8
return $self->http->get("URL given"); # 9
}
Run Code Online (Sandbox Code Playgroud)
然后在其他一些代码中你使用它像这样:
my $myfoo = Foo->new(); # 1
Run Code Online (Sandbox Code Playgroud)
现在$myfoo举行一个实例Foo.然后,您可以调用该对象的方法:
$myfoo->poll(); # 6
Run Code Online (Sandbox Code Playgroud)
逐行描述(替换Foo为代码中的实际包名称):
my $myfoo = Foo->new();
这将调用的"类方法" new之类的Foo,并将结果存储在标量变量$myfoo.此调用在技术上与Foo::new("Foo")(不必重复Foo)相同.见方法调用中perlobj.
my $class = shift;
调用中提供的参数列表new仅包含类名.
shift从@_数组变量中移除并返回第一个值,该数组变量包含调用方法时给定的参数值.有关参数传递和数组的详细信息,请参阅perlsub@_.
因此,此语句将类名存储"Foo"在本地标量变量中$class.
my $self = {property => 'u', provider => 'ramesh'};{…}使用一些初始键/值对
创建对新的匿名哈希的引用,并将其存储在本地标量变量中$self.有关创建引用的详细信息,请参阅perlref.
bless $self, $class;
将存储的哈希引用$self转换为Foo对象,通过" 祝福 "它进入Foo类(请记住$class eq "Foo").
return $self;
返回新创建的对象.
$myfoo->poll();
调用poll标量变量中保存的对象的方法$myfoo.
my ($self)=@_;
实例方法的第一个参数是对象实例本身.
此语句将@_参数数组变量中的第一个值存储到新的本地标量变量中$self.
$self->{CurrentFile}="data.xml";
我们从中new知道$self将是哈希引用.
此语句为包含CurrentFile该对象的哈希引用中的键指定值.
return $self->http->get("URL given");http在$self对象上
调用方法.
在从http方法返回的对象返回上,调用get方法("URL given"作为参数传递).
将调用结果返回给get.