2010-05-15 36 views
8

我想解密一个我不熟悉的Perl代码,不知何故与HashRef有关。 我使用Amazon :: S3,但我的问题是一个普通的Perl问题。请参见下面的代码:Perl方法返回“hashref”是什么意思?

use Amazon::S3; 
my $s3 = Amazon::S3->new(...); 
my $response = $s3->buckets; 

文档(这里)最高审计机关,约S3->桶:

Returns undef on error, else HASHREF of results 

下面的行为我工作,但我不明白为什么:

for $b in (@ { $response->{buckets} }) { 
    print "bucket: " . $b->bucket . "\n"; 
} 

我对第一行的每个操作员感到困惑。

究竟是什么类型$response,$respone->{bucket}。 看起来像for内的表达式是一个数组,但我不明白这个语法:@{ ... }

回答

10

让我们一块一块地看看它。

$s3是你的S3对象。 $s3->buckets对该对象调用buckets方法,并将结果存储在$response中。正如文档所说,结果是一个哈希引用;引用是指向另一个值的标量。如果你熟悉指针,这个想法是一样的。

如果我们有一个普通的散列%response,我们可以通过说$response{buckets}得到散列中的buckets密钥。由于我们有一个散列参考,我们必须使用解引用运算符(->)来获取密钥,以便成为$response->{buckets}

但是我们还没有完成。 $response->{buckets}本身的引用,在这种情况下是数组引用。这里我们看到另一种形式的解引用。例如,如果我们想要获取参考数组中的一个项目,比如说$response->{buckets}[0]。但我们需要整个列表,所以我们使用@运算符来取消整个数组的引用。由于我们的数组引用包含在一个复杂的结构中,因此我们使用curlies来包含具有引用的表达式。所以@{ $response->{buckets} }得到我们的阵列。

这是在一个单一的声明做了很多。

更多关于参考文献,其可以是最棘手的课题之一在Perl学习,请参见以下:

+0

非常感谢。很有用。 – Uri 2010-05-15 22:28:01

+0

perlreftut perlreftut perlreftut :) – hobbs 2010-05-17 00:44:40

-1

您可以使用ref()函数检查变量的类型。

@ {...}的意思是“取消引用标量...作为数组”。所以如果你这样下去:my $ aref = ['a','b'];访问@ {$ aref}将产生数组('a','b')。

类似哈希引用的%{...}。

有关更多信息,请参阅perlreftut。

4

欢迎来到Perl引用的世界!你会发现reference tutorial非常方便。

语法@{...}需要一个标量值并尝试将其引用到数组中。还有%{...},它试图去引用散列。卷曲是可选的,所以你也可以写@$reference%$reference以获得相同的效果。有些人在引用位于散列或数组内时会发现它们在视觉上很有用,这里就是这种情况。

为了帮助您更好地理解数据结构,请尝试使用诸如Data :: Dumper之类的东西。

use Data::Dumper; 
print Dumper $response; 
print Dumper $response->{buckets}; 
# The docs say that buckets is a hashref. It also happens that 
# you can coerce a hash into an array. Let's treat it as a hash 
# and see what's inside it, manually. The Dumper call above should 
# have already provided the structure to you, though. 
foreach my $k (keys %{$response->{buckets}}) { 
    print "$k => " . Dumper $response->{buckets}->{$k} 
}