从嵌套的Perl哈希中取消引用数组引用

时间:2016-01-20 01:34:44

标签: arrays perl hash hash-of-hashes

我希望我已经说明了这个主题。我有一个哈希哈希,我是通过读取文件而构建的。外部哈希是组,然后内部哈希是该组内的参数。每个参数值可以是标量或数组,并且数组可以从零或一开始。

我编写了一个返回参数值的子程序。调用函数必须确定返回的值是标量还是数组。适用于标量。返回对数组值的数组引用(看起来像ARRAY(0x004f00))。使用Data::Dumper吐出看起来像数组的数据,但我无法弄清楚如何在代码中取消引用它。有人能指出我做错了吗?

%HoH = (
    flintstones => {
        husband     => "fred",
        possessions => [ undef, "car", "record player", "rock" ],
        pal         => "barney",
        pets        => [ "bird", "dinosaur" ],
    },
);

get_value("possessions");

sub get_value {

    my $what_i_want = shift;

    @groups = keys(%HoH);

    foreach my $group ( @groups ) {

        foreach my $param ( keys( %{ HoH {group} } ) ) {

            if ( $param eq $what_i_want ) {
                return $HoH{$group}{$param};
            }
        }
    }
}

调用者将返回值赋给数组@return,因此在标量的情况下,它应该将值放在$return[0]中。

对于数组,它应该填充数组。当我调用Dumper时,它会打印出单引号中的标量和方括号中的数组。但是,当我使用scalar(@return)检查数组的大小时,它返回1.

我尝试在末尾使用方括号取消引用return语句,看看我是否可以返回一个标量,但没有运气。

1 个答案:

答案 0 :(得分:2)

您没有显示在上下文中调用的子例程,但快速解决方法是在调用后将其放入

@return = @{ $return[0] } if ref $return[0]


更新

你错过了哈希的观点。您可以使用$what_i_want作为哈希键

来访问参数哈希的正确元素

我建议你改变你的子程序代码看起来像这样

for my $group ( keys %HoH ) {

    my $ret = $HoH{$group}{$what_i_want};

    return unless defined $ret;
    return ref $ret ? @$ret : $ret;
}

这样它永远不会返回引用


更新2

以下是我建议修改的完整程序

use strict;
use warnings 'all';

my %HoH = (
    flintstones => {
        husband     => "fred",
        possessions => [ undef, "car", "record player", "rock" ],
        pal         => "barney",
        pets        => [ "bird", "dinosaur" ],
    },
);

my @return = get_value('possessions');

use Data::Dump;
dd \@return;

sub get_value {

    my ($wanted) = @_;

    for my $group ( keys %HoH ) {

        my $ret = $HoH{$group}{$wanted};

        if ( defined $ret ) {
            return ref $ret ? @$ret : $ret;
        }
    }

    return;
}

输出

[undef, "car", "record player", "rock"]