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

Uri*_*Uri 8 perl

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

use Amazon::S3;
my $s3 = Amazon::S3->new( ... );
my $response = $s3->buckets;
Run Code Online (Sandbox Code Playgroud)

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

Returns undef on error, else HASHREF of results
Run Code Online (Sandbox Code Playgroud)

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

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

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

究竟是什么类型$response,$respone->{bucket}.貌似表达式中的for是一个数组,但我不明白的语法如下:@{ ... }

fri*_*edo 10

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

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

如果我们有一个普通的哈希%response,我们可以buckets通过说明来获取哈希中的密钥$response{buckets}.由于我们有一个哈希引用,我们必须使用dereference运算符(->)来获取密钥,这样就变成了$response->{buckets}.

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

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

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