use strict; use warnings; use Data::Dumper; my @AoA = ( ['tony','skill','old'], ['tony','skill','new'], ['tony','skill1','old'], ['tony','skill1','new'], ['martin','skill','old'], ['martin','skill','new'], ['martin','skill1','old'], ); my (@names,%hash); for my $ary (@AoA) { my ($name,$stage_name,$type) = @$ary; push(@names,$name) unless $hash{$name}; push(@{ $hash{$name}{'stages'} },$stage_name) unless $hash{$name}{$stage_name}; $hash{$name}{$stage_name}{$type}++; } # to see the %hash data structure: print Dumper (\%hash); print qq|
| Name | Stage | Old | New |
|---|---|---|---|
| $print_name | $stage_name | $stage->{'old'} | $stage->{'new'} |