<p>I need to write a function that receives a string and a regex. I need to check if there is a match and return the start and end location of a match. (The regex was already compiled by <code>qr//</code>.)</p>

<p>The function might also receive a "global" flag and then I need to return the (start,end) pairs of all the matches.</p>

<p>I cannot change the regex, not even add <code>()</code> around it as the user might use <code>()</code> and <code>\1</code>. Maybe I can use <code>(?:)</code>.</p>

<p>Example: given "ababab" and the regex <code>qr/ab/</code>, in the global case I need to get back 3 pairs of (start, end).</p>

The pos function gives you the position of the match. If you put your regex in parentheses you can get the length (and thus the end) using
```
length $1
```
.  Like this
```
```
sub match_positions {
    my ($regex, $string) = @_;
    return if not $string =~ /($regex)/;
    return (pos($string) - length $1, pos($string));
}
sub all_match_positions {
    my ($regex, $string) = @_;
    my @ret;
    while ($string =~ /($regex)/g) {
        push @ret, [pos($string) - length $1, pos($string)];
    }
    return @ret
}
```
```