我正在尝试解密一个我不熟悉的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
中的表达式是一个数组,但我不理解这种语法:@{ ... }
?
答案 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。