- binmode FILEHANDLE, DISCIPLINE
- binmode FILEHANDLE
Arranges for FILEHANDLE to be read or written in "binary" or "text" mode on systems where the run-time libraries distinguish between binary and text files. If FILEHANDLE is an expression, the value is taken as the name of the filehandle. DISCIPLINE can be either of
":raw"for binary mode or
":crlf"for "text" mode. If the DISCIPLINE is omitted, it defaults to
binmode() should be called after open() but before any I/O is done on the filehandle.
On many systems binmode() currently has no effect, but in future, it will be extended to support user-defined input and output disciplines. On some systems binmode() is necessary when you're not working with a text file. For the sake of portability it is a good idea to always use it when appropriate, and to never use it when it isn't appropriate.
In other words: Regardless of platform, use binmode() on binary files, and do not use binmode() on text files.
The operating system, device drivers, C libraries, and Perl run-time system all work together to let the programmer treat a single character (
\n) as the line terminator, irrespective of the external representation. On many operating systems, the native text file representation matches the internal representation, but on some platforms the external representation of
\nis made up of more than one character.
Mac OS and all variants of Unix use a single character to end each line in the external representation of text (even though that single character is not necessarily the same across these platforms). Consequently binmode() has no effect on these operating systems. In other systems like VMS, MS-DOS and the various flavors of MS-Windows your program sees a
\nas a simple
\cJ, but what's stored in text files are the two characters
\cM\cJ. That means that, if you don't use binmode() on these systems,
\cM\cJsequences on disk will be converted to
\non input, and any
\nin your program will be converted back to
\cM\cJon output. This is what you want for text files, but it can be disastrous for binary files.
Another consequence of using binmode() (on some systems) is that special end-of-file markers will be seen as part of the data stream. For systems from the Microsoft family this means that if your binary data contains
\cZ, the I/O subsystem will regard it as the end of the file, unless you use binmode().
binmode() is not only important for readline() and print() operations, but also when using read(), seek(), sysread(), syswrite() and tell() (see perlport for more details). See the
$\variables in perlvar for how to manually set your input and output line-termination sequences.