use strict; sub encode { s/((.)\2+)/(length $1) . $2/eg; $_; } sub decode { $_ = shift; my @list; while (/((\d+)?(.))/g) { push @list, [$2,$3]; } join '', map { (defined $_->[0]) ? $_->[1] x $_->[0] : $_->[1]; } @list; } while () { print; my $enc = encode($_); my $dec = decode($enc); print $enc; print $dec; } __DATA__ XYZAAAAAAAADEFAAcdAA #### XYZAAAAAAAADEFAAcdAA XYZA8DEFA2cdA2 XYZAAAAAAAADEFAAcdAA