in reply to Problem with 2nd string match in file using regex with gm operators

I thought that the gm operators would search all of $contents from begining to end and be reset

No. In scalar context, m//g finds the next match and notes where it found the match so it can use that as the starting point for the next match. It would be a waste of CPU to look for more than one match, and it notes where it found the match to allow constructs such as

while (/.../g) { ... }

Drop the "g".

Drop the "m" while you're at it. "m" affects the behaviour of ^ and $, neither of which you are using.

Update: Oh, and /./ should be /\./ since /./ means "match any character", not "match a period".