请解释下面的Perl代码:
sub new {
my $class = shift;
my $self = {property => 'u', provider => 'ramesh'};
bless $self, $class;
return $self;
}
答案 0 :(得分:28)
它是Perl对象的构造函数。 Perl对象可以由任何Perl引用构成。这个恰好是由哈希引用构成的({property => …}
代码创建哈希引用)。请参阅perlobj manpage。
通常你会在一个包中找到这样的代码,它是类及其实例的方法的容器:
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
}
然后在其他一些代码中你可以这样使用它:
my $myfoo = Foo->new(); # 1
现在$myfoo
拥有Foo
的实例。然后,您可以调用对象的方法:
$myfoo->poll(); # 6
逐行说明(将Foo
替换为代码中的实际包名称):
my $myfoo = Foo->new();
这将调用类new
的“类方法”Foo
,并将结果存储在标量变量$myfoo
中。此调用在技术上与Foo::new("Foo")
相同(无需重复Foo
)。请参阅Method Invocation中的perlobj。
my $class = shift;
调用new
时提供的参数列表仅包含类名
shift
删除并返回@_
数组变量中的第一个值,该变量包含调用方法时给定的参数值。
有关参数传递和@_
数组的详细信息,请参阅perlsub
因此,此语句将类名"Foo"
存储在本地标量变量$class
中。
my $self = {property => 'u', provider => 'ramesh'};
使用一些初始键/值对创建对新的匿名哈希{…}
的引用,并将其存储在本地标量变量$self
中。有关创建参考的详细信息,请参阅perlref。
bless $self, $class;
将$self
中存储的哈希引用转换为Foo
对象,将其bless“转换为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
。
答案 1 :(得分:3)
这段代码本身没有做任何事情。但是,如果你有一个文件
package Why::Am::I::So::Funky;
sub new {
my $class = shift;
my $self = {property => 'u', provider => 'ramesh'};
bless $self, $class;
return $self;
}
1;
和另一个像这样的文件
use Why::Am::I::So::Funky;
my $funky = Why::Am::I::So::Funky->new ();
然后会创建一个名为$funky
的Why :: Am :: I :: So :: Funky类的对象。
答案 2 :(得分:1)
在此代码中,您正在构建类的对象。
这里$self
是一个哈希,包含两个关键条目,属性和提供者及其各自的值。
bless
是Perl的内置函数,它接受一个或两个参数,第一个参数是指示对象,第二个参数是保护指示对象的包。如果省略第二个参数,则当前包是使用
现在祝福之后你可以使用$self->{property}
来给你'u'和$self->{provider}
,它会在当前包中给你'ramesh'。
学习Perl的最佳方法是阅读标准书籍 Programming Perl by the inventor itself
。
答案 3 :(得分:0)