Here's one way to do it. I'm creating a hash of hashes, where the elements of the inner hash are array references (so a hash of arrays). This means that for vgs that all have the same maj_num, the hash should only have one key, whereas if the maj_nums are different, there's more than one key. The output generation uses join, map, and de-referencing operations (see perlreftut and perlref).
use warnings; use strict; use Data::Dump; # debug my @vgmap = ( { node => "node1", vg => "vg1", maj_num => 36 }, { node => "node2", vg => "vg1", maj_num => 36 }, { node => "node1", vg => "vg2", maj_num => 37 }, { node => "node2", vg => "vg2", maj_num => 37 }, { node => "node1", vg => "vg3", maj_num => 38 }, { node => "node2", vg => "vg3", maj_num => 40 }, ); my %vgmap; for my $vgm (@vgmap) { push @{ $vgmap{ $vgm->{vg} }{ $vgm->{maj_num} } }, $vgm->{node}; } dd \%vgmap; # debug for my $vg (sort keys %vgmap) { my @maj_nums = sort keys %{ $vgmap{$vg} }; if ( @maj_nums != 1 ) { print "$vg: ", join( "; ", map { "$_ used on " . join ", ", @{ $vgmap{$vg}{$_}} } @maj_nums ), "\n"; } } __END__ { vg1 => { 36 => ["node1", "node2"] }, vg2 => { 37 => ["node1", "node2"] }, vg3 => { 38 => ["node1"], 40 => ["node2"] }, } vg3: 38 used on node1; 40 used on node2
In reply to Re: Compare the values in the hash
by haukex
in thread Compare the values in the hash
by perl_5eeker
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |