首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Perl中迭代哈希(哈希)?

如何在Perl中迭代哈希(哈希)?
EN

Stack Overflow用户
提问于 2010-03-02 20:46:28
回答 7查看 39.2K关注 0票数 16

我有Hash,其中键的值是其他散列。

示例:{'key' => {'key2' => {'key3' => 'value'}}}

我如何遍历这个结构?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-03-02 21:10:10

这是你想要的吗?(未测试)

代码语言:javascript
复制
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...
};
票数 12
EN

Stack Overflow用户

发布于 2010-03-02 22:07:45

这个答案建立在Dave Hinton背后的想法之上--即,编写一个通用子例程来遍历散列结构。这样的散列遍历程序接受代码引用,并简单地调用散列中的每个叶节点的代码。

使用这种方法,同一个散列遍历程序可以用来做很多事情,这取决于我们给它的回调。为了获得更大的灵活性,需要传递两个回调--一个回调在值是散列引用时调用,另一个回调在值是普通标量值时调用。像这样的策略在Marc Jason Dominus的优秀著作“Higher Order Perl”中有更深入的探讨。

代码语言:javascript
复制
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);
票数 24
EN

Stack Overflow用户

发布于 2010-03-02 21:09:50

This post可能会很有用。

代码语言:javascript
复制
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
            # .
            # .
            # .
        }
    }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2363142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档