Here is a regex-based solution. As Anonymous Monk has pointed out, the non-greedy quantifier ? is an important component. But to get all the matches, you need to loop:
#! perl
use strict;
use warnings;
my %matches;
my $s = 'zzAAABCDAAADCBAAABBDAAA';
my $t = $s =~ s/^[^A]*?(AAA.*)/$1/r;
while ($t =~ /^AAA.+?AAA/)
{
my $u = $t;
while ($u =~ /^(AAA.+?AAA)/)
{
my $match = $1;
$match =~ s/\|/AAA/g;
++$matches{$match};
$u =~ s/(AAA.+?)AAA/$1\|/;
}
$t =~ s/^AAA.+?(AAA.*)/$1/;
}
print $_, "\n" for sort keys %matches;
Output:
0:15 >perl 563_SoPW.pl
AAABBDAAA
AAABCDAAA
AAABCDAAADCBAAA
AAABCDAAADCBAAABBDAAA
AAADCBAAA
AAADCBAAABBDAAA
0:23 >
The inner loop finds successively longer matches by changing the AAA at the end of each match into a non-word character. The outer loop truncates the search string by removing everything up to the second AAA.
Hope that helps,
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|