perl逐级输出哈希key和value

Posted 螺旋儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了perl逐级输出哈希key和value相关的知识,希望对你有一定的参考价值。

perl 编程中,hash是一大利器,灵活使用 hash 能让日常工作变得轻松而有趣。本文提供了一种逐级输出key 和 value 的方法。

在编写脚本时,可能会用到多级 hash,所以调试脚本或者检查中间结果时,需要输出每一级 hash 的key 和 value。

perl 模块 Data 提供的 Dumper 可以将 hash 输出来,但是输出的结果呈阶梯状,并没有将每一级的 key 值都输出。 

所以本文提供了另外一种方法,可以逐级输出所有的 key 值及最终的 value,对于检查比较复杂的 hash 各级的 key 与 value 提供了便利。

下面代码中的 “loop_hash” 即为逐级输出 hash 的函数。采用了递归的方法,这样可以保证无论多少级的 hash 都可以输出,本例中用了3级和4级结合的hash。

#!/usr/bin/perl -w
use strict;
use Data::Dumper;

#======================= Main process ======================#
my %hash ;
# simulate a hash   
for my $i (1..2){
    for my $j (3..4){
        for my $k (5..6){
            $hash{"x$i"}{"y$j"}{"z$k"} = "$i$j$k" ;
            for my $m (7..8){
                $hash{"a$i"}{"b$j"}{"c$k"}{"d$m"} = $i+ $j+$k+$m ;
            }
        }
    }
}

print Dumper \%hash ; # method1: print out hash

print "#################\n" ;

loop_hash(\%hash) ;   # method2: print out hash

#======================  Subroutines =======================#
sub loop_hash{
    my $ph = shift;  ## hash
    my $ps = shift;  ## prefix
    $ps ||= "" ;
    for my $i (sort keys %$ph){
        my $pot ;    ## outprint
        if ($ps ne "") {
            $pot .= "$ps -> $i" ;
        }else {
            $pot .= $i ;
        }
        if ( ref($ph->{$i}) eq "HASH" ) { ## check for hash or value
            if ($ps eq "") {
                loop_hash($ph->{$i},$i)  ;
            }else {
               loop_hash($ph->{$i},"$ps -> $i") ;
            }
        }else {
            $pot .= " = $ph->{$i}\n" ;
                    print $pot ;
                }
        }
}

输出的效果如下,可以比较下两种方式的差别。

$VAR1 = {
      'a2' => {
                'b3' => {
                          'c5' => {
                                    'd7' => 17,
                                    'd8' => 18
                                  },
                          'c6' => {
                                    'd7' => 18,
                                    'd8' => 19
                                  }
                        },
                'b4' => {
                          'c5' => {
                                    'd7' => 18,
                                    'd8' => 19
                                  },
                          'c6' => {
                                    'd7' => 19,
                                    'd8' => 20
                                  }
                        }
              },
      'x2' => {
                'y4' => {
                          'z6' => '246',
                          'z5' => '245'
                        },
                'y3' => {
                          'z6' => '236',
                          'z5' => '235'
                        }
              },
      'a1' => {
                'b3' => {
                          'c5' => {
                                    'd7' => 16,
                                    'd8' => 17
                                  },
                          'c6' => {
                                    'd7' => 17,
                                    'd8' => 18
                                  }
                        },
                'b4' => {
                          'c5' => {
                                    'd7' => 17,
                                    'd8' => 18
                                  },
                          'c6' => {
                                    'd7' => 18,
                                    'd8' => 19
                                  }
                        }
              },
      'x1' => {
                'y4' => {
                          'z6' => '146',
                          'z5' => '145'
                        },
                'y3' => {
                          'z6' => '136',
                          'z5' => '135'
                        }
              }
    };
#################
a1 -> b3 -> c5 -> d7 = 16
a1 -> b3 -> c5 -> d8 = 17
a1 -> b3 -> c6 -> d7 = 17
a1 -> b3 -> c6 -> d8 = 18
a1 -> b4 -> c5 -> d7 = 17
a1 -> b4 -> c5 -> d8 = 18
a1 -> b4 -> c6 -> d7 = 18
a1 -> b4 -> c6 -> d8 = 19
a2 -> b3 -> c5 -> d7 = 17
a2 -> b3 -> c5 -> d8 = 18
a2 -> b3 -> c6 -> d7 = 18
a2 -> b3 -> c6 -> d8 = 19
a2 -> b4 -> c5 -> d7 = 18
a2 -> b4 -> c5 -> d8 = 19
a2 -> b4 -> c6 -> d7 = 19
a2 -> b4 -> c6 -> d8 = 20
x1 -> y3 -> z5 = 135
x1 -> y3 -> z6 = 136
x1 -> y4 -> z5 = 145
x1 -> y4 -> z6 = 146
x2 -> y3 -> z5 = 235
x2 -> y3 -> z6 = 236
x2 -> y4 -> z5 = 245
x2 -> y4 -> z6 = 246

如果 hash 结构比较简单,输出为了查看大致结构,可以用第一种方法。如果 hash 结构较为复杂,需要检查某些 key 对应的 value 或者上一级的 key,可以用第二种方法。


——End——





以上是关于perl逐级输出哈希key和value的主要内容,如果未能解决你的问题,请参考以下文章

hash 在 perl 中的用法(转载)

Perl 变量:哈希变量

如何替换 Perl 哈希键?

perl 怎么增加hash键值对

[perl] perl 中二维哈希hash 与python 二维字典dict

将哈希值相加(Perl)