Волшебства нет \n
. И \n
, и \r
всегда означают ровно один символ, и на всех платформах на основе ASCII это \cJ
и \cM
соответственно. (Исключение составляют платформы EBCDIC (по понятным причинам) и MacOS Classic (где \n
и \r
означают \cM
).)
Волшебство, которое происходит в Windows, заключается в том, что при выполнении ввода-вывода через дескриптор файла, помеченный как находящийся в текстовом режиме, \r\n
переводится в \n
при чтении и наоборот при записи. (Кроме того, \cZ
означает конец файла - сюрприз!) Это делается на уровне библиотеки времени выполнения C.
Вам нужно binmode
ваше гнездо, чтобы исправить это.
Вам также следует удалить из шаблона модификаторы /s
и /m
: поскольку вы не используете метасимволы, поведение которых они изменяют (.
и пара ^
/ $
соответственно) они ничего не делают - культ груза.