我希望我已经说明了这个主题。我有一个哈希哈希,我是通过读取文件而构建的。外部哈希是组,然后内部哈希是该组内的参数。每个参数值可以是标量或数组,并且数组可以从零或一开始。
我编写了一个返回参数值的子程序。调用函数必须确定返回的值是标量还是数组。适用于标量。返回对数组值的数组引用(看起来像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语句,看看我是否可以返回一个标量,但没有运气。
答案 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;
}
这样它永远不会返回引用
以下是我建议修改的完整程序
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"]