#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use constant MIN_LENGTH => 2; use constant MIN_REPEATS => 2; # Must have at least this many repeats use Benchmark qw/:all :hireswallclock/; my $str='aacdabcabcecdecd aabcdabcabcecdecd aabcdabcabcecdecd aabcdabcabcecdecd '; #my $str = < .*? \1 ){@{[ $min_count - 2 ]}} .* \1 (?{ ($count{$1} ||= $min_count-1)++ }) (?!) /x; return \%count; } { my %count; sub kramba { my( $string) = @_; my $length = length( $string ); if ($length < MIN_LENGTH) { for (keys %count) { delete $count{$_} if $count{$_} < MIN_REPEATS; } return \%count; } for my $l (MIN_LENGTH..$length) { my $s = substr( $string, 0, $l ); $count{ $s } += 1; } kramba( substr( $string, 1 ) ); }; } for my $multiplier (1) { my $work_str = "$str " x $multiplier; my $x1 = blazar $work_str; my $x2 = oha $work_str; my $x3 = kramba $work_str; my $x4 = ikegami $work_str; my $x5 = lodin $work_str; #print Dumper( [$x1, $x2, $x3, $x4, $x5] ); print "Number of substrings found: \n"; printf( "%9s ", $_ ) for ('blazar', 'oha', 'kramba', 'ikegami', 'lodin' ); print "\n"; printf( "%9s ", $_ ) for map { scalar keys %$_ } ($x1, $x2, $x3, $x4, $x5); print "\n"; #exit; for my $key (keys %$x3) { if (not exists $x4->{$key}) { print ("\"$key\": ", $x3->{$key}, "\n"); my $index = index( $work_str, $key ); if ($index < 0) { print "\tNot found...!!\n"; } else { print "\t$work_str\n", "\t" . '.' x ($index) . $key . "\n"; } } } print "Results for string:\n\n\"$work_str\"\n\n"; cmpthese 500/$multiplier => { blazar => sub { blazar $work_str }, oha => sub { oha $work_str }, kramba => sub { kramba $work_str }, ikegami => sub { ikegami $work_str }, lodin => sub { lodin $work_str }, } }