use strict; use warnings; use Data::Dump 'dump'; my @numbers = ( 1, 2, 2, 4, 8, 42, 7, 2, 6, 7, 9, 42 ); dump { find_duplicates( @numbers ) }; sub find_duplicates { my @list = @_; my $idx; my %buckets; foreach my $item ( @list ) { push @{$buckets{$item}}, $idx++; } delete @buckets{ grep { @{$buckets{$_}} < 2 } keys %buckets }; return %buckets; }