diff options
author | Nick Ing-Simmons <nik@tiuk.ti.com> | 2001-03-28 18:24:02 +0000 |
---|---|---|
committer | Nick Ing-Simmons <nik@tiuk.ti.com> | 2001-03-28 18:24:02 +0000 |
commit | 7d3b96bbd83d17f17b26b4c05ef623881c8477be (patch) | |
tree | 4bccefb45f6e9329c0e9904ee99fee832b8fc4bc /lib/open.pm | |
parent | 7847df5a36f8e61e9a1cfaa59d60168ea45d5381 (diff) | |
download | perl-7d3b96bbd83d17f17b26b4c05ef623881c8477be.tar.gz |
PerlIO.pm / perlio.pm conflict.
Update some pods.
Make t/op/utf8decode.t a text file.
p4raw-id: //depot/perlio@9417
Diffstat (limited to 'lib/open.pm')
-rw-r--r-- | lib/open.pm | 70 |
1 files changed, 45 insertions, 25 deletions
diff --git a/lib/open.pm b/lib/open.pm index 53ae308310..1aef9040b5 100644 --- a/lib/open.pm +++ b/lib/open.pm @@ -2,6 +2,7 @@ package open; use Carp; $open::hint_bits = 0x20000; +# layers array and hash mainly manipulated by C code in perlio.c use vars qw(%layers @layers); # Populate hash in non-PerlIO case @@ -58,44 +59,63 @@ open - perl pragma to set default disciplines for input and output =head1 DESCRIPTION -The open pragma is used to declare one or more default disciplines for -I/O operations. Any open() and readpipe() (aka qx//) operators found -within the lexical scope of this pragma will use the declared defaults. -Neither open() with an explicit set of disciplines, nor sysopen() are -influenced by this pragma. +Full-fledged support for I/O disciplines is now implemented provided perl is +configured to use PerlIO as its IO system (which is now the default). -Only the two pseudo-disciplines ":raw" and ":crlf" are currently -available. +The C<open> pragma serves as one of the interfaces to declare default +"layers" (aka disciplines) for all I/O. + +The C<open> pragma is used to declare one or more default layers for +I/O operations. Any open(), readpipe() (aka qx//) and similar operators +found within the lexical scope of this pragma will use the declared defaults. + +When open() is given an explicit list of layers they are appended to the +list declared using this pragma. + +Directory handles may also support disciplines in future. + +=head1 NONPERLIO FUNCTIONALITY + +If perl is not built to use PerlIO as its IO system then only the two pseudo-disciplines +":raw" and ":crlf" are available. The ":raw" discipline corresponds to "binary mode" and the ":crlf" discipline corresponds to "text mode" on platforms that distinguish between the two modes when opening files (which is many DOS-like -platforms, including Windows). These two disciplines are currently -no-ops on platforms where binmode() is a no-op, but will be -supported everywhere in future. +platforms, including Windows). These two disciplines are +no-ops on platforms where binmode() is a no-op, but perform their +functions everywhere if PerlIO is enabled. + +=head1 IMPLEMENTATION DETAILS -=head1 UNIMPLEMENTED FUNCTIONALITY +There are two package variables C<%layers> and C<@layers> which +are mainly manipulated by C code in F<perlio.c>, but are visible +to the nosy: -Full-fledged support for I/O disciplines is currently unimplemented. -When they are eventually supported, this pragma will serve as one of -the interfaces to declare default disciplines for all I/O. + print "Have ",join(',',keys %open::layers),"\n"; + print "Using ",join(',',@open::layers),"\n"; -In future, any default disciplines declared by this pragma will be -available by the special discipline name ":DEFAULT", and could be used -within handle constructors that allow disciplines to be specified. -This would make it possible to stack new disciplines over the default -ones. +The C<%open::layers> hash is a record of the available "layers" that may be pushed +onto a C<PerlIO> stream. The values of the hash are perl objects, of class C<PerlIO::Layer> +which are created by the C code in F<perlio.c>. As yet there is nothing useful you +can do with the objects at the perl level. - open FH, "<:para :DEFAULT", $file or die "can't open $file: $!"; +The C<@open::layers> array is the current set of layers and their arguments. +The array consists of layer => argument pairs and I<must> always have even number of +entries and the even entries I<must> be C<PerlIO::Layer> objects or perl will "die" +when it attempts to open a filehandle. In most cases the odd entry will be C<undef>, +but in the case of (say) ":encoding(iso-8859-1)" it will be 'iso-8859-1'. These +argument entries are currently restricted to being strings. -Socket and directory handles will also support disciplines in -future. +When a new C<PerlIO> stream is opened, the C code looks at the +array to determine the default layers to be pushed. So with care it is possible +to manipulate the default layer "stack": -Full support for I/O disciplines will enable all of the supported -disciplines to work on all platforms. + splice(@PerlIO::layers,-2,2); + push(@PerlIO::layers,$PerlIO::layers{'stdio'} => undef); =head1 SEE ALSO -L<perlfunc/"binmode">, L<perlfunc/"open">, L<perlunicode> +L<perlfunc/"binmode">, L<perlfunc/"open">, L<perlunicode>, L<PerlIO> =cut |