Возможно, вы слишком усложняете проблему. По сути, это вариант кодирования длин серий .
Идея состоит в том, чтобы пройтись по списку и увеличить счетчик для каждого символа, чтобы вычислить, какова длина «бега» или сколько последующих символов равно текущему символу. Найдя длину, добавьте ее к результату в соответствующем формате и пропустите все элементы, которые вы только что свели вместе.
use strict;
use warnings;
use Data::Dumper;
my @a = split //, "aaabccdcx";
my @rle;
for (my $i = 0; $i < @a;) {
my $j = 1;
while ($i + $j < @a && $a[$i+$j] eq $a[$i]) {
$j++;
}
push @rle, $a[$i] . ($j > 1 ? " (x$j)" : "");
$i += $j;
}
print Dumper \@rle;
Вывод:
$VAR1 = [
'a (x3)',
'b',
'c (x2)',
'd',
'c',
'x'
];
Вот плагин jQuery с большим количеством функций:
http://jscroller2.markusbordihn.de/example/image-scroller-windiv/
И этот "шелковистый гладкий"