5

我想知道这个子例程在 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. @$写的时候语法是什么意思@$self{keys %extra} = values %extra;
4

2 回答 2

4

实际上是$self指调用子程序的变量_init()吗?

变量不调用子程序。

->调用者( in左侧的内容->_init())作为第一个参数传递给方法,然后您将其放入$self. (shift()shift(@_)in subs 的缩写。)

@$写的时候语法是什么意思@$self{keys %extra} = values %extra;

@hash{LIST}是一个哈希片

@{ EXPR }{LIST}是一个散列切片,其中要切片的散列是通过引用指定的。当EXPR是简单的标量查找时,卷曲是可选的,所以@{ $hash_ref }{LIST}可以写成@$hash_ref{LIST}.

该方法将参数添加到%$self用作调用者的基于散列的对象。也可以这样写:

%$self = ( %$self, @_ );
于 2013-09-18T17:33:28.887 回答
4

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

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

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

另一种写法是:

foreach my $key (keys %extra) {
  $self->{$key} = $extra{$key};
}
于 2013-09-18T17:29:46.060 回答