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