2011-11-15 122 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

啊,我想我被我的缺乏理解所困,箭头只是一个方便的简写。 –