В Perl escape-коды "\ r" и "\ n" НЕ гарантированно идентичны "\ 015" и "\ 012".
Если вы хотите напечатать CRLF для сетевого протокола, вы должны использовать «\ 015 \ 012» или «\ cM \ cJ».
Вот цитата, прямо из perldoc perlop:
Все системы используют виртуальный «\ n» для представления ограничителя строки,
называется "новой строкой". Нет такой вещи, как неизменный, физический
символ новой строки. Это всего лишь иллюзия, что операционная система,
драйверы устройств, библиотеки C и Perl - все это для сохранения. Не
все системы читают "\ r" как ASCII CR и "\ n" как ASCII LF. Например,
на древних Маках (до MacOS X) прошлых лет
в обратном порядке, и в системах без ограничителя строки, печать "\ n" может
не излучать фактические данные. В общем, используйте «\ n», когда имеете в виду «новую строку»
для вашей системы, но используйте буквальный ASCII, когда вам нужен точный
персонаж. Например, большинство сетевых протоколов ожидают и предпочитают
CR + LF ("\ 015 \ 012" или "\ cM \ cJ") для ограничителей строки, и хотя
они часто принимают только «\ 012», они редко терпят просто «\ 015». Если
вы привыкли использовать "\ n" для работы в сети, вы можете быть сожжены
когда-нибудь.
И еще, аналогичная информация, из perldoc -f binmode:
Операционная система, драйверы устройств, библиотеки C и среда выполнения Perl
все системы сговорились, чтобы позволить программисту обрабатывать один символ (\ n
) как терминатор строки, независимо от внешнего представления. На
во многих операционных системах родное представление текстового файла соответствует
внутреннее представление, но на некоторых платформах внешнее
представление \ n состоит из более чем одного символа.
Все варианты файлов Unix, Mac OS (старые и новые) и Stream_LF в VMS
использовать один символ для завершения каждой строки во внешнем представлении
текста (даже если этот единственный символ является возврат каретки на старом,
предшествует дарвиновским версиям Mac OS и является LINE FEED в Unix и большинстве VMS
файлы). В других системах, таких как OS / 2, DOS и различные разновидности
MS-Windows, ваша программа видит \ n как простой \ cJ, но что хранится
в текстовых файлах есть два символа \ cM \ cJ. Это означает, что если вы
не используйте binmode () в этих системах, последовательности \ cM \ cJ на диске будут
преобразуется в \ n на входе, и любой \ n в вашей программе будет преобразован
вернуться к \ cM \ cJ на выходе. Это то, что вы хотите для текстовых файлов, но это
может иметь катастрофические последствия для двоичных файлов.