Perl:哈希引用访问键的数组

16

我有一个看似基础的问题,但是却无法解决。假设我在Perl中拥有一个哈希引用,我希望通过一个键的数组来获取值的数组。

以下是使用哈希而不是哈希引用的方法:

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

my @testValues = @testHash{@testKeys};

现在假设我有一个哈希引用(hash reference):

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

我尝试了以下两种方法:
my @values = @{$hashRef->{@testKeys}};
my @values = $hashRef->{@testKeys};

但两者都不正确。有没有正确的方法,或者我每次想这样做都必须取消引用哈希引用?

1个回答

23

你很接近:

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

或者

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

更多示例,请参见perllol文档中的"Slices"

"perlref文档中的Using References"提供了一般规则。

1. 任何你想在变量或子程序名中放置标识符(或标识符链)的地方,都可以用包含正确类型引用的简单标量变量替换标识符。

这就解释了为什么(1)起作用:你用简单的标量$hashRef替换了标识符testHash

2. 任何你想在变量或子程序名中放置标识符(或标识符链)的地方,都可以用返回正确类型引用的BLOCK替换标识符。

上面的代码段(2)几乎相同,但语法稍微有些笨重。你可以用返回到哈希的引用的块代替标识符testHash,即{$hashRef}

这里的大括号括起来一个真正的块,因此你可以计算并返回一个引用,比如

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

2
在这种情况下,@$hashref{@testKeys}也可以工作。我曾经更喜欢使用{}大括号,因为它更明确,但现在我更倾向于使用更简洁的变体。 - ephemient
@ephemient 感谢您帮助我改进答案。 - Greg Bacon
啊,我想我被自己对箭头符号只是方便的简写这一事实的理解不足所困住了。 - Tianxiang Xiong
只是为了更好地理解箭头的用法,有没有一种方法可以使用箭头来完成这个操作?看起来 @$hashRef->{@testKeys} 应该可以工作,但实际上并不行。我认为这里涉及到运算符优先级的问题。 - Tianxiang Xiong
1
@user864684 相同的perlref章节将箭头描述为语法糖:“3.子程序调用和查找单个数组元素…”,切片查找多个元素,所以箭头语法不适用。 - Greg Bacon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接