if (length ($string) > 15) { my $last; if ($string =~ /\s(\S{1,12})$/) { $last = $1; # a suitable end word } $starting_length = 12 - length($last); if ($string =~ /(.{0,$starting_length})\s/) { # greedy pattern match, matches multiple words $string = "$1...$last"; } else { $string = substr($string,0,12) . "..."; } }