use strict; use warnings; use Data::Dumper; my @students = ( { name => "Gil", college => "Yale", }, { name => "Gil", college => "Harvard", }, { name => "Gil", college => "Harvard", }, ); my @unique = do { my( %seenName, %seenCollege ); grep { !$seenName{$_->{name}}++ or !$seenCollege{$_->{college}}++ } @students}; print Dumper \@unique;