1

我希望我已经正确地陈述了这个主题。我有一个通过读取文件构建的哈希值。外部散列是组,然后内部散列是该组内的参数。每个参数值可以是标量或数组,数组可以从 0 或 1 开始。

我编写了一个返回参数值的子程序。调用函数必须确定返回值是标量还是数组。适用于标量。返回对数组值的数组的引用(看起来像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 语句,看看我是否可以返回一个标量,但没有运气。

4

1 回答 1

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"]
于 2016-01-20T01:38:02.830 回答