我想知道这个子程序在Perl中做了什么。我相信我有一般的想法,但我想知道一些语法。
sub _init
{
my $self = shift;
if (@_) {
my %extra = @_;
@$self{keys %extra} = values %extra;
}
}
这就是我的想法:基本上将任何“额外”键值对添加到由变量$ self引用的无名哈希中。此外,我不是100%肯定这一点,但我认为my $self = shift
实际上是指调用$self
子例程的变量_init()
。
我的具体问题是:
_init()
?@$
@$self{keys %extra} = values %extra;
语法的含义是什么?
醇>
答案 0 :(得分:4)
您的理解是正确的。这允许类的用户将他们想要的任何参数设置到对象中。
是。如果您致电$myobject->_init('color', 'green')
,则此代码将设置为$myobject->{'color'} = 'green'
。
这是一个有点混乱的哈希操作。 keys %extra
是一个列表(显然是键)。我们在这里有效地使用“哈希切片”。可以把它想象成一个数组切片,在那里你可以调用@$arrayref[1, 3, 4]
。我们在这里使用@
符号,因为我们正在讨论列表 - 它是与keys %extra
引用的哈希中的键$self
列表对应的值列表。
另一种写这个的方法是:
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, @_ );