use List::MoreUtils qw( apply ); for my $bin (0..1) { for my $eol ("\n", "\r", "\r\n") { my $name = $eol; $name =~ s/\r/cr/; $name =~ s/\n/lf/; $name .= '-bin' if $bin; { open(my $fh, '>', $name); binmode($fh) if $bin; print $fh map { "$_$eol" } qw( abc def ); } my $file = do { open(my $fh, '<', $name); binmode($fh); local $/; <$fh> }; my $data = join ' ', apply { s/\x0D/CR/ } apply { s/\x0A/LF/ } split //, $file; printf("%-9s %s\n", "$name:", $data); unlink($name); }} #### lf: a b c CR LF d e f CR LF <- want cr: a b c CR d e f CR crlf: a b c CR CR LF d e f CR CR LF lf-bin: a b c LF d e f LF cr-bin: a b c CR d e f CR crlf-bin: a b c CR LF d e f CR LF <- want