2011-11-15 125 views
15

我有一個似乎基本的問題,但我無法弄清楚。假設我在Perl中有一個哈希引用。我想通過一組鍵來獲取一組值。Perl:哈希引用訪問鍵陣列

下面是它會如何利用哈希工作,而不是一個散列引用:

my %testHash = ("a" => 1, "b" => 2, "c" => 3); 
my @testKeys = ("a", "b", "c"); 

my @testValues = @testHash{@testKeys}; 

現在假設我有一個散列引用,

my $hashRef = {"a" => 1, "b" => 2, "c" => 3}; 

我試過有以下兩種方式:

my @values = @{$hashRef->{@testKeys}}; 
my @values = $hashRef->{@testKeys}; 

但這兩者都不正確。有沒有一種正確的方法,或者我每次想要這樣做時都必須解除散列引用的引用?

回答

21

你接近:

my @values = @$hashref{@testKeys};  ## (1) 

my @values = @{$hashref}{@testKeys}; ## (2) 

更多的例子,請參閱"Slices" in the perllol documentation

"Using References" in the perlref documentation給出了一般規則。

1.無論您將標識符(或標識符鏈)作爲變量或子例程名稱的一部分,您都可以用包含正確類型引用的簡單標量變量替換標識符。

這解釋了爲什麼(1)有效:將標識符testHash替換爲簡單標量$hashRef

2.您可以將一個標識符(或標識符鏈)作爲變量或子例程名稱的一部分添加到任何位置,您可以用返回正確類型的引用的BLOCK替換該標識符。

上面的代碼段(2)幾乎相同,但是有一點體積較大的語法。代替標識符testHash,您可以編寫一個返回散列引用的塊,即,即{$hashRef}

這裏的大括號中一個善意塊,這樣你就可以計算並返回一個參考,在

push @{ $cond ? \@a1 : \@a2 }, "some value"; 
+2

在這種情況下,'@ $ {hashref} @testKeys'工作過。我過去更喜歡'{}'大括號,因爲它更加明確,但現在我傾向於不那麼吵鬧的變體。 – ephemient

+0

@ephemient感謝您幫助我改進答案。 –

+0

啊,我想我被我的缺乏理解所困,箭頭只是一個方便的簡寫。 –