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的主要内容,如果未能解决你的问题,请参考以下文章