所以我有一大堆哈希。
$VAR1 = {
'Peti Bar' => {
'Mathematics' => 82,
'Art' => 99,
'Literature' => 88
},
'Foo Bar' => {
'Mathematics' => 97,
'Literature' => 67
}
};
我在网上找到了一个例子。
我想要打印的是'Peti Bar'和'Foo Bar',但它并不那么简单。想象一下数学就是它在哈希等中的自己的哈希所以我想要打印'Peti Bar' - > '数学' - > 'AnotherHash' 'Foo Bar' - > '文学' - > 'Anotherhash'
我想也许我要问的是打印散列的散列而没有每个散列的键/值。
答案 0 :(得分:1)
最简单的方法可能是使用递归函数来遍历顶级哈希和任何子哈希,在下降到子哈希之前打印任何具有子哈希的键:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
my %bighash = (
'Peti Bar' => {
'Mathematics' => {
'Arithmetic' => 7,
'Geometry' => 8,
'Calculus' => 9,
},
'Art' => 99,
'Literature' => 88
},
'Foo Bar' => {
'Mathematics' => 97,
'Literature' => 67
}
);
dump_hash(\%bighash);
sub dump_hash {
my $hashref = shift;
my @parents = @_;
return unless $hashref && ref $hashref eq 'HASH';
for my $key (sort keys %$hashref) {
my $val = $hashref->{$key};
next unless ref $val eq 'HASH';
say join ' -> ', @parents, $key;
dump_hash($val, @parents, $key);
}
}
输出:
Foo Bar
Peti Bar
Peti Bar -> Mathematics
答案 1 :(得分:0)
与Dave S相似
use strict;
my $VAR1 = {
'Peti Bar' => {
'Mathematics' => 82,
'Art' => 99,
'Literature' => 88
},
'Foo Bar' => {
'Mathematics' => 97,
'Literature' => 67
}
};
sub printHash($$) {
my $hashRef = shift;
my $indent = shift;
for (keys %$hashRef) {
if (ref($hashRef->{$_}) eq 'HASH') {
print "$indent$_ \n";
printHash($hashRef->{$_},"\t$indent");
}
else {
print "$indent$_ $hashRef->{$_}\n";
}
}
}
printHash($VAR1,undef);
输出是:
Foo Bar
Mathematics 97
Literature 67
Peti Bar
Literature 88
Mathematics 82
Art 99