in reply to Re^3: different length of a line from linux and windows textfile? ("\r")
in thread different length of a line from linux and windows textfile?

chomp removes \r\n only on MSWin. On Linux, it only removes \n:
~$ perl -E '$x = "|\r\n";print $x;chomp $x; print $x' | xxd 0000000: 7c0d 0a7c 0d |..|.
لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
  • Comment on Re^4: different length of a line from linux and windows textfile? ("\r")
  • Download Code

Replies are listed 'Best First'.
Re^5: different length of a line from linux and windows textfile? (myth)
by tye (Sage) on Mar 17, 2014 at 18:02 UTC

    No, you are both wrong. chomp just removes a trailing "\n" (by default). On every platform (I'm ignoring how ancient MacOS misdefined "\r", of course).

    Running Perl on Windows will likely cause a "\r\n" in a file to end up as just "\n" in your Perl string. In that case, the fact that chomp does nothing to "\r" doesn't cause a problem. But it is not chomp that is getting rid of the "\r" for you.

    You can actually make chomp get rid of "\r\n" by setting $/ = "\r\n", but that also makes chomp not get rid of "\n" (unless it is immediately preceded by "\r"). So that's a worse idea.

    s/\s+$// is a much better idea than chomp.

    - tye        

Re^5: different length of a line from linux and windows textfile? ("\r")
by fishmonger (Chaplain) on Mar 17, 2014 at 22:00 UTC

    On Windows chomp will remove both "\n" and "\r\n".

    D:\test>od -c win32.txt 0000000 l i n e o n e \r \n l i n e +t 0000020 w o 0000022 D:\test>od -c nix.txt 0000000 l i n e o n e \n l i n e t +w 0000020 o \n 0000022 D:\test>perl -pi.bak -e "chomp $_;" win32.txt D:\test>perl -pi.bak -e "chomp $_;" nix.txt D:\test>od -c win32.txt 0000000 l i n e o n e l i n e t w +o 0000020 D:\test>od -c nix.txt 0000000 l i n e o n e l i n e t w +o 0000020

      No. You are wrong. Yes, you show code that uses chomp and results in "\r"s being dropped. Now drop the chomp and see that there are still no "\r" characters. As I already explained, the lack of "\r" has nothing to do with chomp.

      On Windows chomp will remove both "\n" and "\r\n".

      It is a lack of binmode that strips "\r". chomp only strips "\n". So you can also see this by adding binmode and showing that "\r" is not stripped despite your use of chomp (even though you are using Windows Perl).

      - tye        

        Maybe I'm not understanding your point, but according to my tests chomp sill strips out "\r" when using binmode on Windows.

        D:\test>od -c win32.txt 0000000 l i n e o n e \r \n l i n e +t 0000020 w o \r \n 0000024 D:\test>od -c nix.txt 0000000 l i n e o n e \r \n l i n e +t 0000020 w o \r \n 0000024 D:\test>perl -wpi.bak -e "BEGIN{binmode STDIN; binmode STDOUT;} chomp +$_;" win32.txt D:\test>perl -wpi.bak -e "BEGIN{binmode STDIN; binmode STDOUT;} chomp +$_;" nix.txt D:\test>od -c win32.txt 0000000 l i n e o n e l i n e t w +o 0000020 D:\test>od -c nix.txt 0000000 l i n e o n e l i n e t w +o 0000020