CUFP
GrandFather
snippet
<div class="Description"><p>sub findCycle searches a string to determine if it is comprised of a pattern repeated two or more times and returns the pattern length and the pattern.</p>
<p>If there is not a repeating pattern, the length of the string and the entire string are returned.</p></div>
<CODE>
use strict;
use warnings;
while (<DATA>)
{
chomp;
my ($pattern, $cycleLen) = findCycle ($_);
print "$_ -> $pattern ($cycleLen)\n";
}
sub findCycle
{
my $str = shift;
my $copy = $str;
my $cycleLen = 0;
my $strLen = length ($copy);
for (0..($strLen - 1))
{
$copy .= substr $copy, 0, 1, '';
$cycleLen = $_ + 1;
($str ^ $copy) =~ /^\0*/;
return wantarray ? ($cycleLen, substr $str, 0, $cycleLen)
: $cycleLen if $+[0] == $strLen;
}
return wantarray ? ($strLen, $str) : $strLen;
}
__DATA__
TTTTT
ATATAT
ATTATTATT
123412341234
123456
</CODE>