我正在尝试解密一个我不熟悉的,与HashRef有关的Perl代码。
我正在使用Amazon::S3,但我的问题是有关Perl的一般问题。请参见下面的代码:
use Amazon::S3;
my $s3 = Amazon::S3->new( ... );
my $response = $s3->buckets;
关于s3-> bucket的文档(此处)说:
Returns undef on error, else HASHREF of results
以下行对我有用,但我不明白为什么:
for $b in ( @ { $response->{buckets} } ) {
print "bucket: " . $b->bucket . "\n";
}
第一行的每个运算符让我感到困惑。
确切的类型是
$response
,$respone->{bucket}
。看来
for
中的表达式是一个数组,但我不理解此语法:@{ ... }
吗? 最佳答案
让我们一步一步地进行研究。$s3
是您的S3对象。 $s3->buckets
在该对象上调用buckets
方法,然后将结果存储在$response
中。正如文档所说,结果是一个哈希引用。引用是指向另一个值的标量。如果您熟悉指针,则想法是相同的。
如果我们有一个简单的哈希%response
,则可以通过说buckets
来获得哈希中的$response{buckets}
键。由于我们有一个哈希引用,因此必须使用解引用运算符(->
)来获取 key ,因此它变为$response->{buckets}
。
但是我们还没有完成。 $response->{buckets}
本身是一个引用,在这种情况下为数组引用。在这里,我们看到了另一种形式的取消引用。如果我们只想获得引用数组中的一项,我们可以说$response->{buckets}[0]
。但是我们需要整个列表,因此我们使用@
运算符取消对整个数组的引用。由于数组引用包含在复杂的结构中,因此我们使用curl来包含具有引用的表达式。因此,@{ $response->{buckets} }
为我们获取了数组。
在一个语句中就完成了很多工作。
有关引用的更多信息,这可能是Perl中最难学的主题之一,请参见以下内容:
关于perl - Perl方法返回 "hashref"是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2840699/