我有一个看似基本的问题,但我无法弄明白.假设我在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)