【问题标题】:Perl: Hash ref accessing array of keysPerl:哈希引用访问键数组
【发布时间】:2011-12-29 05:07:47
【问题描述】:

我有一个看似基本的问题,但我想不通。假设我在 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};

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

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    你已经接近了:

    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";
    

    【讨论】:

    • 在这种情况下,@$hashref{@testKeys} 也可以。我以前更喜欢{} 大括号更明确,但我现在更倾向于噪音较小的变体。
    • @ephemient 感谢您帮助我改进答案。
    • 啊,我想我被困住了,因为我不明白箭头只是一种方便的速记。
    • 只是为了让我更好地理解箭头的用法,有没有办法用箭头做到这一点?似乎 @$hashRef->{@testKeys} 应该工作,但它没有。我认为运算符的优先顺序存在问题。
    • @user864684 相同的 perlref 部分将箭头描述为语法糖:“3. 子程序调用和 单个数组元素的查找 ...” 切片查找多个元素,因此箭头语法不适用。
    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2016-06-06
    • 2015-06-26
    • 2011-07-26
    • 2013-03-08
    相关资源
    最近更新 更多