当前位置:  开发笔记 > 编程语言 > 正文

遍历Perl中的多维哈希

如何解决《遍历Perl中的多维哈希》经验,为你挑选了3个好方法。

如果perl中有多个维度的哈希(或哈希引用),并且您希望迭代所有值,那么最好的方法是什么.换句话说,如果我们有$ f - > {$ x} {$ y},我想要类似的东西

foreach ($x, $y) (deep_keys %{$f})
{
}

代替

foreach $x (keys %f) 
    {
    foreach $y (keys %{$f->{$x}) 
    {
    }
}

Penfold.. 12

第一阶段:不要重新发明轮子:)

快速搜索CPAN会引发非常有用的Data :: Walk.定义一个子程序来处理每个节点,然后进行排序

use Data::Walk;

my $data = { # some complex hash/array mess };

sub process {
   print "current node $_\n";
}

walk \&process, $data;

而鲍勃是你的叔叔.请注意,如果你想传递一个散列来散步,你需要传递一个对它的引用(参见 perldoc perlref),如下所示(否则它也会尝试并处理你的哈希键!):

walk \&process, \%hash;

对于更全面的解决方案(但在CPAN中乍看之下更难找到),请使用 Data :: Visitor :: Callback或其父模块 - 这样做的好处是可以更好地控制您的操作,并且(仅限于额外的街道) cred)是用Moose写的.



1> Penfold..:

第一阶段:不要重新发明轮子:)

快速搜索CPAN会引发非常有用的Data :: Walk.定义一个子程序来处理每个节点,然后进行排序

use Data::Walk;

my $data = { # some complex hash/array mess };

sub process {
   print "current node $_\n";
}

walk \&process, $data;

而鲍勃是你的叔叔.请注意,如果你想传递一个散列来散步,你需要传递一个对它的引用(参见 perldoc perlref),如下所示(否则它也会尝试并处理你的哈希键!):

walk \&process, \%hash;

对于更全面的解决方案(但在CPAN中乍看之下更难找到),请使用 Data :: Visitor :: Callback或其父模块 - 这样做的好处是可以更好地控制您的操作,并且(仅限于额外的街道) cred)是用Moose写的.



2> bmdhacks..:

这是一个选项.这适用于任意深度哈希:

sub deep_keys_foreach
{
    my ($hashref, $code, $args) = @_;

    while (my ($k, $v) = each(%$hashref)) {
        my @newargs = defined($args) ? @$args : ();
        push(@newargs, $k);
        if (ref($v) eq 'HASH') {
            deep_keys_foreach($v, $code, \@newargs);
        }
        else {
            $code->(@newargs);
        }
    }
}

deep_keys_foreach($f, sub {
    my ($k1, $k2) = @_;
    print "inside deep_keys, k1=$k1, k2=$k2\n";
});



3> Corion..:

这听起来好像Data :: Diver或Data :: Visitor对你来说是好方法.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有