我有一个自定义的perl哈希数据结构。结构如下:
%myhash = (
1 => {
'scf1' => [
1,3,0,4,6,7,8,
],
'sef2' => [
10,15,20,30,
]
},
2 => {
'scf1' => [
10,3,0,41,6,47,81,
],
'scf3' => [
1,66,0,123,4,1,2435,33445,1
]
},
);
我如何访问这种perl结构。
答案 0 :(得分:2)
我担心你的代码......显示出你误解了哈希的作用以及它们如何运作的迹象。具体来说,当您引用@{$myhash}
时,这与您%myhash
的{{1}}不同。
同样 - undef
发生了什么?看起来你正在尝试构建一个数组数组,但是通过迭代@features
然后推送来实现这一点。多维数组有时候是工作的正确工具,但不清楚为什么它适合你正在做的事情。 (毕竟,你不要在这段代码中用它做任何其他事情)。
你还有fetchrow_array
- 这也没有做你想象的那样 - 它没有引用$line[2]
,它是名为$line
的列表的第二个元素 - 不存在。
您还尝试处理数据库条目列表,如果它是undef则将其设置为“-1”。
我们需要更详细地了解您从数据库中获取的数据 - @line
可以是任何数据。但是,我强烈建议你要做的就是在你去的时候给每个字段命名。我建议你不要在那里使用$sth -> fetchrow_array()
,因为它是......好吧,错了。您正在迭代刚刚获取的行中的列。
获取数组中的哪个字段是哈希的键?看起来你正试图键入“字段5”字段7'并尝试插入“字段1”和“字段2”的值。那是对的吗?
哦,当你在它的时候打开$line
。
答案 1 :(得分:0)
获取内部数组:
my @array = @{$hash{1}->{'scf1'}};
# is same as
# my $array_ref = $hash{1}->{'scf1'};
# my @array = @{$array_ref};
# then you can
my $some_thing = $array[0];
或获取一个元素:
$hash{1}->{'scf1'}->[0];
答案 2 :(得分:0)
在Data::Dumper
转储中,我看到您有一个名为%myhash
的哈希。该哈希中的每个元素都包含对另一个哈希的引用。并且,该内部哈希中的每个元素都包含对数组的引用。
让我们带你的Data :: Dumper,然后像这样重写:
$myhash{1}->{sff1} = [1, 3, 0, 4, 6, 7, 8];
$myhash{1}->{sef2} = [10, 15, 20, 30];
$myhash{2}->{scf1} = [10, 3, 0, 41, 6, 47, 81];
$myhash{2}->{scf3} = [1, 66, 0, 123, 4, 2435, 33445, 1];
同样的事情。它只是更紧凑。
要打印出来,我们需要遍历每个参考层:
#
# First loop: The outer hash which is a plain normal hash
#
for my $outer_key ( sort keys %myhash ) {
#
# Each element in that hash points to another hash reference. Dereference
#
my %inner_hash = %{ $myhash{$outer_key} };
for my $inner_key ( sort keys %inner_hash ) {
#
# Finally, this is our array reference in the inner hash. Let's dereference and print
#
print "\$myhash{$outer_key}->{$inner_key}: ";
my @array = @{ $myhash{$outer_key}->{$inner_key} };
for my $value ( @array ) {
print "$value";
}
print "\n";
}
}