use Data::Dumper; my %counts; my @array = qw (aa bb cc aa aa cc cc dd aa aa); %counts = map {$_ => ++$counts{$_} } @array; print Dumper(\%counts); #### my %counts = map { my $n; do { $n = (($last=$_) ... ($last ne $_)) } while $n =~ /E0$/; ($last => $n); } sort @array;