这个Perl代码有什么作用?

use*_*862 2 perl

请解释下面的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为代码中的实际包名称):

  1. my $myfoo = Foo->new();
    这将调用的"类方法" new之类的Foo,并将结果存储在标量变量$myfoo.此调用在技术上与Foo::new("Foo")(不必重复Foo)相同.见方法调用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对象,通过" 祝福 "它进入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.

  • ++:一流的解释! (2认同)