my @foobar = ( 'foo m 1 m 2 m 3 m 4 bar', 'foo m 2 m 4 m 7 bar', 'foo m 1 bar' ); my ($cnt, @match) = (0, ()) ; /^foo (?:m (\d+)(?{push @{$match[$cnt]}, $^N}) )+bar(?{++$cnt})/ for @foobar; print map "@$_\n", @match;