sub check_reps { my ($pwd) = @_; while ($pwd =~ /(?=((.+)\2+))/g) { printf "%s repeated %d times, covers %d%%\n", $2, length($1) / length($2), 100 * length($1) / length($pwd) ; } } check_reps('xattattttatty'); __END__ att repeated 2 times, covers 46% ttatt repeated 2 times, covers 76% tt repeated 2 times, covers 30% t repeated 3 times, covers 23% t repeated 2 times, covers 15% t repeated 2 times, covers 15%