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