X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FPerlIO.pm;h=1ee5b8881548cdeb25b3a63397047cf608fe2109;hb=4ec2216f20a53a69267b31ce136e7410687cbe32;hp=9a4da3a2a343a9e8598139b3ebd076df20c5b7ce;hpb=1cbfc93d1589e4f5f6103e097177be6f791b2cb2;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/PerlIO.pm b/lib/PerlIO.pm index 9a4da3a..1ee5b88 100644 --- a/lib/PerlIO.pm +++ b/lib/PerlIO.pm @@ -33,7 +33,7 @@ PerlIO - On demand loader for PerlIO layers and root of PerlIO::* name space =head1 SYNOPSIS - open($fh,">:crlf", "my.txt"); # portably open a text file for writing + open($fh,"<:crlf", "my.txt"); # portably open a text file for reading open($fh,"<","his.jpg"); # portably open a binary file for reading binmode($fh); @@ -79,6 +79,8 @@ its operations. A layer which does CRLF to "\n" translation distinguishing "text" and "binary" files in the manner of MS-DOS and similar operating systems. +(It currently does I mimic MS-DOS as far as treating of Control-Z +as being an end-of-file marker.) =item utf8 @@ -110,27 +112,60 @@ to a such a stream. =item raw -B layer is deprecated.> +The C<:raw> layer is I as being identical to calling +C - the stream is made suitable for passing binary +data i.e. each byte is passed as-is. The stream will still be +buffered. Unlike earlier versions of perl C<:raw> is I just the +inverse of C<:crlf> - other layers which would affect the binary nature of +the stream are also removed or disabled. -A pseudo-layer which performs two functions (which is messy, but -necessary to maintain compatibility with non-PerlIO builds of Perl -and their way things have been documented elsewhere). +The implementation of C<:raw> is as a pseudo-layer which when "pushed" +pops itself and then any layers which do not declare themselves as suitable +for binary data. (Undoing :utf8 and :crlf are implemented by clearing +flags rather than poping layers but that is an implementation detail.) -Firstly it forces the file handle to be considered binary at that -point in the layer stack, i.e. it turns off any CRLF translation. +As a consequence of the fact that C<:raw> normally pops layers +it usually only makes sense to have it as the only or first element in a +layer specification. When used as the first element it provides +a known base on which to build e.g. -Secondly in prevents the IO system seaching back before it in the -layer specification. Thus: + open($fh,":raw:utf8",...) - open($fh,":raw:perlio",...) +will construct a "binary" stream, but then enable UTF-8 translation. -Forces the use of C layer even if the platform default, or -C default is something else (such as ":encoding(iso-8859-7)") -(the C<:encoding> requires C) which would interfere with -binary nature of the stream. +=item pop + +A pseudo layer that removes the top-most layer. Gives perl code +a way to manipulate the layer stack. Should be considered +as experimental. Note that C<:pop> only works on real layers +and will not undo the effects of pseudo layers like C<:utf8>. +An example of a possible use might be: + + open($fh,...) + ... + binmode($fh,":encoding(...)"); # next chunk is encoded + ... + binmode($fh,":pop"); # back to un-encocded + +A more elegant (and safer) interface is needed. =back +=head2 Alternatives to raw + +To get a binary stream an alternate method is to use: + + open($fh,"whatever") + binmode($fh); + +this has advantage of being backward compatible with how such things have +had to be coded on some platforms for years. + +To get an un-buffered stream specify an unbuffered layer (e.g. C<:unix>) +in the open call: + + open($fh,"<:unix",$path) + =head2 Defaults and how to override them If the platform is MS-DOS like and normally does CRLF to "\n"