Just to clarify the previous replies, using binmode on the input handle is not enough. You must use binmode (or its equivalent) on both the input and the output handles.
In Windows,
Not using binmode on the input handle will cause the convertion of CRLF to LF.
Not using binmode on the output handle will cause the convertion of LF to CRLF.
So while $content contained an identical copy of the file, print was converting all LFs to CRLFs.
The output handle is STDOUT in this case, so just add binmode STDOUT; before the print to fix the problem.
| [reply] [d/l] [select] |
madtoperl: it's a pity you didn't google this before you posted, otherwise you might have noticed this livejournal entry from "timwi" a few years ago that had the exact same problem (and nearly the exact same code, and wording, of your question).
It's reproduced here for your convenience:
Timwi (timwi) wrote in perl,
@ 2004-10-21 00:11:00
Continued problems with binary files
Dear hackers again,
thanks for your hints in the previous entry. However, I'm still having
+ problems here.
How do I simply load a file into memory? Again, without corrupting any
+ line endings?
I've tried this:
#!C:\Perl\bin\perl.exe
use strict;
print "Content-Type: image/jpeg\n\n";
local $/ = undef;
open F, 'C:\Temp\temp.jpg';
binmode F;
my $content = <F>;
close F;
print $content;
and this produces a corrupt response. What is the correct way of loadi
+ng a binary file? Thanks for any help in advance.
--chargrill
s**lil*; $*=join'',sort split q**; s;.*;grr; &&s+(.(.)).+$2$1+; $; =
qq-$_-;s,.*,ahc,;$,.=chop for split q,,,reverse;print for($,,$;,$*,$/)
| [reply] [d/l] [select] |
I would think that the load is fine, but using print to dump the content of the file seems somewhat dubious! What makes you thing that the content of $content is not what it ought to be?
DWIM is Perl's answer to Gödel
| [reply] [d/l] |
Hi
I added binmode STDOUT and it works perfectly now.
Try the same in your code.
Thanks!
"Keep pouring your ideas"
| [reply] |