sub _init在Perl解释中

时间:2013-09-18 17:21:37

标签: perl

我想知道这个子程序在Perl中做了什么。我相信我有一般的想法,但我想知道一些语法。

sub _init 
{
  my $self = shift;
  if (@_) {
    my %extra = @_;
    @$self{keys %extra} = values %extra;
  }
}

这就是我的想法:基本上将任何“额外”键值对添加到由变量$ self引用的无名哈希中。此外,我不是100%肯定这一点,但我认为my $self = shift实际上是指调用$self子例程的变量_init()

我的具体问题是:

  1. $ self实际上是指调用子例程_init()
  2. 的变量
  3. 撰写@$
  4. @$self{keys %extra} = values %extra;语法的含义是什么?

2 个答案:

答案 0 :(得分:4)

您的理解是正确的。这允许类的用户将他们想要的任何参数设置到对象中。

  1. 是。如果您致电$myobject->_init('color', 'green'),则此代码将设置为$myobject->{'color'} = 'green'

  2. 这是一个有点混乱的哈希操作。 keys %extra是一个列表(显然是键)。我们在这里有效地使用“哈希切片”。可以把它想象成一个数组切片,在那里你可以调用@$arrayref[1, 3, 4]。我们在这里使用@符号,因为我们正在讨论列表 - 它是与keys %extra引用的哈希中的键$self列表对应的值列表。

  3. 另一种写这个的方法是:

    foreach my $key (keys %extra) {
      $self->{$key} = $extra{$key};
    }
    

答案 1 :(得分:4)

  

$self实际上引用了调用子例程_init()的变量吗?

变量不会调用子程序。

调用者(->->_init()左侧的内容)作为第一个参数传递给方法,并将其放在$self中。 (shift()是潜艇中shift(@_)的缩写。)

  

撰写@$

@$self{keys %extra} = values %extra;语法的含义是什么?

@hash{LIST}hash slice

@{ EXPR }{LIST}是一个哈希切片,其中通过引用指定要切片的哈希值。当EXPR是简单的标量查找时,curlies是可选的,因此@{ $hash_ref }{LIST}可以写为@$hash_ref{LIST}

该方法将参数添加到%$self,即用作调用者的基于哈希的对象。它也可以写成如下:

%$self = ( %$self, @_ );