这个Perl代码有什么作用?

时间:2010-07-02 08:43:24

标签: perl

请解释下面的Perl代码:

sub new {
    my $class = shift;
    my $self = {property => 'u', provider => 'ramesh'};
    bless $self, $class;
    return $self;
}

4 个答案:

答案 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替换为代码中的实际包名称):

  1. my $myfoo = Foo->new();
    这将调用类new的“类方法”Foo,并将结果存储在标量变量$myfoo中。此调用在技术上与Foo::new("Foo")相同(无需重复Foo)。请参阅Method Invocation中的perlobj

  2. my $class = shift;
    调用new时提供的参数列表仅包含类名 shift删除并返回@_数组变量中的第一个值,该变量包含调用方法时给定的参数值。 有关参数传递和@_数组的详细信息,请参阅perlsub 因此,此语句将类名"Foo"存储在本地标量变量$class中。

  3. my $self = {property => 'u', provider => 'ramesh'};
    使用一些初始键/值对创建对新的匿名哈希{…}的引用,并将其存储在本地标量变量$self中。有关创建参考的详细信息,请参阅perlref

  4. bless $self, $class;
    $self中存储的哈希引用转换为Foo对象,将其bless“转换为Foo类(请记住,$class eq "Foo")。

  5. return $self;
    返回新创建的对象。

  6. $myfoo->poll();
    调用标量变量poll中保存的对象的$myfoo方法。

  7. my ($self)=@_;
    实例方法的第一个参数是对象实例本身 此语句将@_参数数组变量中的第一个值存储到新的本地标量变量$self中。

  8. $self->{CurrentFile}="data.xml";
    我们从new知道$self将是哈希引用 此语句为体现该对象的哈希引用中的CurrentFile键赋值。

  9. 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)

阅读 perlboot 初学者的面向对象教程 perltoot Tom的对象面向Perl的面向对象的教程,在Perl中学习面向对象的编程:

perldoc perlboot
perldoc perltoot