http://www.perlmonks.org?node_id=988902


in reply to Duplicate Element in an Array

It is not clear how you arrive at your expected output. Your group one is clear enough but I can't see the logic of how you arrive at your groups two, three and four. Perhaps you could explain further how you are separating the items. Here is a possible solution that builds an AoA by forming arrays of unique and duplicate items then recursively acting on the duplicates until none are left. It does not arrive at the same group members you show. The code.

use strict; use warnings; use Data::Dumper; my @input = qw{ 1200 1300 1200 1000 1100 1200 1500 1700 2000 2100 3000 2100 1200 1500 1700 1700 }; my @groups = deDup( \ @input ); print Data::Dumper->Dumpxs( [ \ @groups ], [ qw{ *groups } ] ); sub deDup { my $raToCheck = shift; my $raUniq = []; my $raDups = []; my %seen; push @{ $seen{ $_ } ++ ? $raDups : $raUniq }, $_ for @$raToCheck; return $raUniq, @$raDups ? deDup( $raDups ) : (); }

The output.

@groups = ( [ '1200', '1300', '1000', '1100', '1500', '1700', '2000', '2100', '3000' ], [ '1200', '2100', '1500', '1700' ], [ '1200', '1700' ], [ '1200' ] );

I hope this is helpful.

Cheers,

JohnGG