我正在尝试解密一个我不熟悉的,与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中最难学的主题之一,请参见以下内容:

  • perlreftut-Perl引用教程
  • perldsc-Perl数据结构指南
  • perllol-关于数组
  • 的所有数组
  • perlref-主要的Perl引用文档
  • 关于perl - Perl方法返回 "hashref"是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2840699/

    10-12 00:43