So how do you check that the string contains only what you expect? For example you might have the following code
while ($str =~ s/\A(foo)//) {
push @got, $1;
}
die "unexpected stuff in string: $str" if $str ne '';
This takes a paranoid approach, checking that there is no junk at the beginning of the string before the series of 'foo' begins, and no junk at the end. It would be more efficient to just say
@got = $str =~ m/(foo)/g;
but now you lose error checking. If $str contains 'xfooy' then the leading and trailing junk will be silently ignored. That's not great, since unmatched 'junk' more often than not indicates a bug in your regexp you need to fix.
Is there a way to get the efficiency of m//g but still check that the whole string is matched? I suspect it will involve the \G anchor but I am not sure how.