Perl:Hash ref访问键组

Tia*_*ong 15 perl hash

我有一个看似基本的问题,但我无法弄明白.假设我在Perl中有一个哈希引用.我想通过一组键获得一个值数组.

以下是它如何使用哈希,而不是哈希引用:

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

my @testValues = @testHash{@testKeys};
Run Code Online (Sandbox Code Playgroud)

现在假设我有一个哈希引用,

my $hashRef = {"a" => 1, "b" => 2, "c" => 3};
Run Code Online (Sandbox Code Playgroud)

我尝试了以下两种方式:

my @values = @{$hashRef->{@testKeys}};
my @values = $hashRef->{@testKeys};
Run Code Online (Sandbox Code Playgroud)

但两者都不正确.有没有正确的方法,或者每次我想要这样做时我只需要取消引用哈希引用?

Gre*_*con 21

你很亲密:

my @values = @$hashref{@testKeys};     ## (1)
Run Code Online (Sandbox Code Playgroud)

要么

my @values = @{$hashref}{@testKeys};   ## (2)
Run Code Online (Sandbox Code Playgroud)

有关更多示例,请参阅perllol文档中的"切片".

perlref文档中的"使用引用"给出了一般规则.

1.在将标识符(或标识符链)作为变量或子例程名称的一部分放置的任何地方,可以使用包含正确类型引用的简单标量变量替换标识符.

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

2.在您将标识符(或标识符链)作为变量或子例程名称的一部分放置的任何地方,您可以使用BLOCK替换标识符,返回正确类型的引用.

上面的代码段(2)几乎相同,但语法有点笨重.代替标识符testHash,则写一个块返回到散列,基准,{$hashRef}.

这里的括号包含一个真正的块,因此您可以计算并返回一个引用,如

push @{ $cond ? \@a1 : \@a2 }, "some value";
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,`@ $ hashref {@testKeys}`也可以.我过去更喜欢`{}`括号更明确,但我现在倾向于较少嘈杂的变体. (2认同)