Hm, valóban a Vim odatett egy \n-t, pedig kérte a fene. Egyébként sosem értettem, miért olyan fontos a \n? Régi fordítók warningoltak is ilyesmire, de nem értem az okát.
És azt sem értem, hogy miért viselkedik így a Perl. Na mindegy, minden sor végére oda lehet kézzel pöttyinteni a soremelést:
while(<>) {
tr/\n\r//d; # https://en.wikipedia.org/wiki/Newline
$_ .= "\n";
...