【问题标题】:What does it mean when a Perl method returns a "hashref"?Perl 方法返回“hashref”是什么意思?
【发布时间】:2010-05-15 15:47:34
【问题描述】:

我正在尝试解密一个我不熟悉的 Perl 代码,它与 HashRef 有某种关系。 我正在使用 Amazon::S3,但我的问题是一般的 Perl 问题。请看下面的代码:

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

文档(此处)sais,关于 s3->buckets:

Returns undef on error, else HASHREF of results

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

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

我对第一行的每个运算符都感到困惑。

$response$respone->{bucket} 到底是什么类型。 看起来for 中的表达式是一个数组,但我不明白这个语法:@{ ... }?

【问题讨论】:

    标签: perl


    【解决方案1】:

    让我们一步一步来。

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

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

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

    这在一个语句中做了很多事情。

    有关参考资料的更多信息,这可能是 Perl 中最棘手的科目之一,请参阅以下内容:

    【讨论】:

    • perlreftut perlreftut perlreftut :)
    【解决方案2】:

    欢迎来到 Perl 引用的世界!你会发现reference tutorial 非常方便。

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-12-02
        • 2018-06-09
        • 2018-03-05
        • 1970-01-01
        • 2020-05-21
        • 1970-01-01
        • 2010-12-28
        • 2013-04-25
        • 1970-01-01
        相关资源
        最近更新 更多