sub _init在Perl解释中

rag*_*age 5 perl

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

sub _init 
{
  my $self = shift;
  if (@_) {
    my %extra = @_;
    @$self{keys %extra} = values %extra;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

我的具体问题是:

  1. $ self实际上是指调用子例程的变量_init()吗?
  2. 什么是@$写作时的语法意思@$self{keys %extra} = values %extra;

Dan*_*Dan 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};
}
Run Code Online (Sandbox Code Playgroud)