my @array = qw(bb aa dd cc aa aa cc aa aa cc); print "$_\n" for uniq_ordered_count( \@array ); sub uniq_ordered_count { my $list = shift; my %count; $count{ $_ }++ for @$list; return map { exists $count{$_} ? "$_ - " . delete $count{$_} : () } @$list; }