use strict; use warnings; use Data::Dump qw/pp dd/; my @in = ( { CC => "X5667", ID => 11, Name => "Mary" }, { CC => "X456", ID => 10, Name => "Joe" }, { CC => "P45", ID => "X2", Name => "Carl" }, { CC => "PK1", ID => 12, Name => "Jim" }, { CC => "X5667", ID => 11, Name => "Mary" }, ); # --- Version1 ID deserves its name my %seen1; my @out1 = grep { ! $seen1{ $_->{ID} }++ } @in; pp \@out1; # --- Version2 combine values to one multi-dim key my %seen2; my @out2 = grep { ! $seen2{ $_->{ID}, $_->{Name}, $_->{CC} }++ } @in; pp \@out2;