Here's my solution, which I sent to the OP off list. Funny how he never reported back with a summary, as is the custom....
# operates on $_ sub find_subsequences { #local $_ = shift; # if you'd rather pass it. my( $chars, $min_occurrences, $max_subseq_length, $results_ar ) = @_; $results_ar ||= []; my @p; # a sliding window of positions at which pattern matches. while ( /[$chars]/g ) { push @p, pos() - 1; # since pos() is 1-based. shift @p while @p > $min_occurrences; # slide the window if ( @p == $min_occurrences ) { my $len = $p[-1] - $p[0] + 1; if ( $len <= $max_subseq_length ) { my $subseq = substr $_, $p[0], $len; push @$results_ar, [ $p[0], $subseq ]; } } } $results_ar } # test my @chars = qw( A T C G ); $_ = ''; for ( my $i = 0; $i < 10_000; $i++ ) { $_ .= $chars[ rand @chars ]; } use Tie::Array; @Tie::ArrayPrint::ISA = qw( Tie::StdArray ); sub Tie::ArrayPrint::PUSH { my $self = shift; @_ == 1 && ref($_[0]) eq 'ARRAY' and print "\@ $_[0][0] ($_[0][1])\n"; push @$self, @_; } my @subseqs; #tie @subseqs, 'Tie::ArrayPrint'; find_subsequences( join('',@chars[0,1]), 7, 12, [EMAIL PROTECTED] ); print scalar(@subseqs), " hits found.\n"; -- John Douglas Porter __________________________________ Do you Yahoo!? Yahoo! Mail - More reliable, more storage, less spam http://mail.yahoo.com