#!/usr/local/bin/perl use strict; use warnings; my $foo = 'abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiii' . 'jjjjjjjjjj122333444455555666666777777788888888999999999!'; for my $longest ( 1 .. 5 ) { my $bar = max_run_1 ( $longest, $foo ); print 'max_run_1: ' . $bar . "\n"; $bar = max_run_2 ( $longest, $foo ); print 'max_run_2: ' . $bar . "\n"; } sub max_run_1 { my $max = $_[0]; my $len = length $_[1]; ### loop prelude my $char = substr $_[1], 0, 1; my $count = 1; my $new_string = $char; my $at = 1; while ( $at < $len ) { my $old_char = $char; $char = substr $_[1], $at++, 1; if ( $char eq $old_char ) { next if $count >= $max; $count++; } else { $count = 1; } $new_string .= $char; } return $new_string; } sub max_run_2 { my $max = $_[0]; ( my $new_string = $_[1] ) =~ s/(.)\1{$max,}/$1 x $max/eg; return $new_string; }