我有Hash,其中键的值是其他散列。
示例:{'key' => {'key2' => {'key3' => 'value'}}}
我如何遍历这个结构?
发布于 2010-03-02 21:10:10
这是你想要的吗?(未测试)
sub for_hash {
my ($hash, $fn) = @_;
while (my ($key, $value) = each %$hash) {
if ('HASH' eq ref $value) {
for_hash $value, $fn;
}
else {
$fn->($value);
}
}
}
my $example = {'key' => {'key2' => {'key3' => 'value'}}};
for_hash $example, sub {
my ($value) = @_;
# Do something with $value...
};
发布于 2010-03-02 22:07:45
这个答案建立在Dave Hinton背后的想法之上--即,编写一个通用子例程来遍历散列结构。这样的散列遍历程序接受代码引用,并简单地调用散列中的每个叶节点的代码。
使用这种方法,同一个散列遍历程序可以用来做很多事情,这取决于我们给它的回调。为了获得更大的灵活性,需要传递两个回调--一个回调在值是散列引用时调用,另一个回调在值是普通标量值时调用。像这样的策略在Marc Jason Dominus的优秀著作“Higher Order Perl”中有更深入的探讨。
use strict;
use warnings;
sub hash_walk {
my ($hash, $key_list, $callback) = @_;
while (my ($k, $v) = each %$hash) {
# Keep track of the hierarchy of keys, in case
# our callback needs it.
push @$key_list, $k;
if (ref($v) eq 'HASH') {
# Recurse.
hash_walk($v, $key_list, $callback);
}
else {
# Otherwise, invoke our callback, passing it
# the current key and value, along with the
# full parentage of that key.
$callback->($k, $v, $key_list);
}
pop @$key_list;
}
}
my %data = (
a => {
ab => 1,
ac => 2,
ad => {
ada => 3,
adb => 4,
adc => {
adca => 5,
adcb => 6,
},
},
},
b => 7,
c => {
ca => 8,
cb => {
cba => 9,
cbb => 10,
},
},
);
sub print_keys_and_value {
my ($k, $v, $key_list) = @_;
printf "k = %-8s v = %-4s key_list = [%s]\n", $k, $v, "@$key_list";
}
hash_walk(\%data, [], \&print_keys_and_value);
发布于 2010-03-02 21:09:50
This post可能会很有用。
foreach my $key (keys %hash) {
foreach my $key2 (keys %{ $hash{$key} }) {
foreach my $key3 (keys %{ $hash{$key}{$key2} }) {
$value = $hash{$key}{$key2}->{$key3};
# .
# .
# Do something with $value
# .
# .
# .
}
}
}
https://stackoverflow.com/questions/2363142
复制相似问题