我有一个看似基本的问题,但我无法弄清楚。假设我有 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};
但这两种说法都不正确。有没有正确的方法,或者我每次想这样做时都必须取消引用哈希引用?
你很接近:
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";