我有一个看似基本的问题,但我无法弄明白。假设我在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};
但两者都不正确。有没有正确的方法,或者每次我想要这样做时我只需要取消引用哈希引用?
答案 0 :(得分: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";