Perl:哈希引用访问键数组

问题描述 投票:0回答:1

我有一个看似基本的问题,但我无法弄清楚。假设我有 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};

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

arrays perl hash
1个回答
23
投票

你很接近:

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

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

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

perlref 文档中的“使用引用”给出了一般规则。

1.无论您将标识符(或标识符链)作为变量或子例程名称的一部分,都可以将标识符替换为包含正确类型引用的简单标量变量。

这解释了为什么 (1) 有效:您用简单标量

testHash
替换了标识符
$hashRef

2.无论您将标识符(或标识符链)作为变量或子例程名称的一部分,您都可以用返回正确类型引用的 BLOCK 替换该标识符。

上面的代码片段 (2) 几乎相同,但语法有点庞大。您可以编写一个返回哈希引用的块来代替标识符

testHash
i.e.
{$hashRef}

此处的大括号包含一个bona fide块,因此您可以计算并返回引用,如

所示
push @{ $cond ? \@a1 : \@a2 }, "some value";
© www.soinside.com 2019 - 2024. All rights reserved.