use warnings; use strict; my @data = qw( # ... ); my @new; my @data_tmp = @data; while (1) { my %test; @new = (); for my $item (@data_tmp) { next if $item !~ /^\d{2,}$/; my $suffix = chop($item); $test{$item}{$suffix}++; } for my $base (keys %test) { if (scalar(keys %{$test{$base}}) == 10) { push @new, $base; } else { push @new, $base.$_ for keys %{$test{$base}}; } } last if $#new == $#data_tmp; @data_tmp = @new; } print "$_\n" for sort @new;