note
Sidhekin
<p> ... and if you still want a one-step approach ... </p>
<p>This must be a job for the /g modifier and its side-kick, \G: </p>
<c>
my (@match) = $str =~ /(?:^foo |(?<!^)\G)m (\d+) (?=(?:m \d+ )*bar)/g;
</c>
<p> (The negative lookbehind in order to prevent matching strings starting with the <c>m \d+ </c> pattern — the positive lookahead to prevent matching strings that don't properly close with <c>bar</c>.) </p>
<p> With a little test case, it looks like this: </p>
<c>
my @test = ( 'foo m 1 m 2 m 3 m 4 bar',
'foo m 2 m 4 m 7 bar',
'foo m 1 bar',
'm 2 foo m 1 bar',
'foo m 1 c 2 bar',
'foo m 1 bar m 2',
'foo m 1 m 5 m 7',
);
for my $str (@test) {
my (@match) = $str =~ /(?:^foo |(?<!^)\G)m (\d+) (?=(?:m \d+ )*bar)/g;
local $" = ', ';
print "'$str' => (@match)\n";
}
</c>
<p> ... and outputs like this: </p>
<c>
'foo m 1 m 2 m 3 m 4 bar' => (1, 2, 3, 4)
'foo m 2 m 4 m 7 bar' => (2, 4, 7)
'foo m 1 bar' => (1)
'm 2 foo m 1 bar' => ()
'foo m 1 c 2 bar' => ()
'foo m 1 bar m 2' => (1)
'foo m 1 m 5 m 7' => ()</c>
<p> <b>Update:</b> Almost missed the "bar" requirement. Fixed now, right? </p>
<div class="pmsig"><div class="pmsig-106949">
<p align=center>
<font size=-1><code>print "Just another Perl ${\(trickster and hacker)},"</code></font>
<br>The Sidhekin <b>proves</b> Sidhe did it!</p>
</div></div>
640610
640610