Dirk80 has asked for the wisdom of the Perl Monks concerning the following question:

Hello monks,

I know that this is a known topic. But I don't understand why the following code snippet is not doing what it should do.

use strict; use warnings; use open IN => ':crlf', OUT => ':raw'; @ARGV = ( "test.txt" ); $^I = ".bak"; while( <> ) { print; }

I have a file "test.txt" which contains lines with endings 0x0D0A (windows line endings). Because of the open pragma, I would assume that the input layer ':crlf' converts the 0x0d0a to 0x0a. But this is not happening. And because of the output layer, I would assume, that the ":raw" then only writes "0a" line endings to the file. But what happens is that "0d0a" endings are written to the file. This means the file is unchanged at the end. I think the output layer is not working, because the input layer is not converting 0x0d0a to 0x0a.

Why is the input layer not converting 0x0d0a to 0x0a?

Thank you alot.

Dirk

Replies are listed 'Best First'.
Re: diamond operator, inplace edit and io layers
by Anonymous Monk on Jul 03, 2012 at 19:23 UTC

      The difference is that you are not doing inplace editing.

      UPDATE

      I now tried your examples. And partly I have different results:

      Same result like you.

      $ perl -e" binmode STDOUT; $|=1; print qq[\x0d\x0a]; " | od -tx1 0000000 0d 0a 0000002

      Different result.

      $ perl -e" binmode STDOUT; $|=1; print qq[\x0d\x0a]; " | perl -e" use +open qw/ IN :crlf OUT :raw /; print join q/ /, unpack q/H*/, scalar<> +; " 0d0a

      Here my perl version.

      $ perl -v This is perl 5, version 14, subversion 2 (v5.14.2) built for i686-linu +x-gnu-thread-multi-64int