2010-05-15 41 views
8

我想解密一個我不熟悉的Perl代碼,不知何故與HashRef有關。 我使用Amazon :: S3,但我的問題是一個普通的Perl問題。請參見下面的代碼:Perl方法返回「hashref」是什麼意思?

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

文檔(這裏)最高審計機關,約S3->桶:

Returns undef on error, else HASHREF of results 

下面的行爲我工作,但我不明白爲什麼:

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

我對第一行的每個操作員感到困惑。

究竟是什麼類型$response,$respone->{bucket}。 看起來像for內的表達式是一個數組,但我不明白這個語法:@{ ... }

回答

10

讓我們一塊一塊地看看它。

$s3是你的S3對象。 $s3->buckets對該對象調用buckets方法,並將結果存儲在$response中。正如文檔所說,結果是一個哈希引用;引用是指向另一個值的標量。如果你熟悉指針,這個想法是一樣的。

如果我們有一個普通的散列%response,我們可以通過說$response{buckets}得到散列中的buckets密鑰。由於我們有一個散列參考,我們必須使用解引用運算符(->)來獲取密鑰,以便成爲$response->{buckets}

但是我們還沒有完成。 $response->{buckets}本身的引用,在這種情況下是數組引用。這裏我們看到另一種形式的解引用。例如,如果我們想要獲取參考數組中的一個項目,比如說$response->{buckets}[0]。但我們需要整個列表,所以我們使用@運算符來取消整個數組的引用。由於我們的數組引用包含在一個複雜的結構中,因此我們使用curlies來包含具有引用的表達式。所以@{ $response->{buckets} }得到我們的陣列。

這是在一個單一的聲明做了很多。

更多關於參考文獻,其可以是最棘手的課題之一在Perl學習,請參見以下:

+0

非常感謝。很有用。 – Uri 2010-05-15 22:28:01

+0

perlreftut perlreftut perlreftut :) – hobbs 2010-05-17 00:44:40

-1

您可以使用ref()函數檢查變量的類型。

@ {...}的意思是「取消引用標量...作爲數組」。所以如果你這樣下去:my $ aref = ['a','b'];訪問@ {$ aref}將產生數組('a','b')。

類似哈希引用的%{...}。

有關更多信息,請參閱perlreftut。

4

歡迎來到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} 
}