http://www.perlmonks.org?node_id=344480


in reply to newline behavior in Regular Expression

Short answer: the s option does less than you think it does.

Longer answer: in a perl regular expression match, without the m option being applied to the match, a $ will match both the end of the string and, if the string ends in a newline, will also match right before the final newline. The s option does not change the behavior of $. It does, however, change the behavior of . so that . will match any character, up to and including newline.

But you did (.*?). That is, you made the .* match non-greedy, meaning that it took as few characters as possible, so it took everything before but not including the final newline, and then $ matched right before the final newline character.

The solution is to not make the second match non-greedy (i.e. use (.*) and not (.*?)), or to use something that really means just the end of the line and nothing else - that is, use \z instead of $.

All of this is fairly clearly explained by doing perldoc perlre, q.v.