当Perl方法返回“hashref”时,它意味着什么?

时间:2010-05-15 15:47:35

标签: perl

我正在尝试解密一个我不熟悉的Perl代码,以某种方式与HashRef相关。 我正在使用Amazon :: S3,但我的问题是一般的Perl问题。请参阅以下代码:

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

文档(这里)sais,关于s3->桶:

Returns undef on error, else HASHREF of results

以下一行对我有用,但我不明白为什么:

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

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

$response$respone->{bucket}的确切类型。 看起来for中的表达式是一个数组,但我不理解这种语法:@{ ... }

3 个答案:

答案 0 :(得分:10)

让我们一块一块地完成它。

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

如果我们有一个普通哈希%response,我们可以通过说buckets来获取哈希中的$response{buckets}键。由于我们有一个哈希引用,我们必须使用解除引用运算符(->)来获取密钥,因此它变为$response->{buckets}

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

这在一个声明中做了很多。

有关引用的更多信息,这可能是在Perl中学习的最棘手的主题之一,请参阅以下内容:

答案 1 :(得分:4)

欢迎来到Perl参考世界!你会发现reference tutorial非常方便。

语法@{...}采用标量值并尝试将其取消引用到数组中。还有%{...},它试图取消引用哈希。 curlies是可选的,因此您也可以编写@$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}
}

答案 2 :(得分:-1)

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

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

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

有关详细信息,请参阅perlreftut。