diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 2000-03-09 17:39:58 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 2000-03-09 17:39:58 +0000 |
commit | 16fe6d5906f6eff9da00cb861a7054a440d1f6eb (patch) | |
tree | f3ff2ac74f436b26fa347b78d5a7c2cb63206bd6 /lib | |
parent | 023ceb80f0d82032a841fbab1bfd1282af1def7b (diff) | |
download | perl-16fe6d5906f6eff9da00cb861a7054a440d1f6eb.tar.gz |
support binmode(F,":crlf") and use open IN => ":raw", OUT => ":crlf"
semantics; the pragma sets defaults for both open() and qx//
p4raw-id: //depot/perl@5628
Diffstat (limited to 'lib')
-rw-r--r-- | lib/open.pm | 70 |
1 files changed, 55 insertions, 15 deletions
diff --git a/lib/open.pm b/lib/open.pm index da8a04453c..8f5c13833b 100644 --- a/lib/open.pm +++ b/lib/open.pm @@ -1,4 +1,27 @@ package open; +$open::hint_bits = 0x20000; + +sub import { + shift; + die "`use open' needs explicit list of disciplines" unless @_; + $^H |= $open::hint_bits; + while (@_) { + my $type = shift; + if ($type =~ /^(IN|OUT)\z/s) { + my $discp = shift; + unless ($discp =~ /^\s*:(raw|crlf)\s*\z/s) { + die "Unknown discipline '$discp'"; + } + $^H{"open_$type"} = $discp; + } + else { + die "Unknown discipline class '$type'"; + } + } +} + +1; +__END__ =head1 NAME @@ -6,31 +29,48 @@ open - perl pragma to set default disciplines for input and output =head1 SYNOPSIS - use open IN => ":any", OUT => ":utf8"; # unimplemented + use open IN => ":crlf", OUT => ":raw"; =head1 DESCRIPTION -NOTE: This pragma is not yet implemented. - The open pragma is used to declare one or more default disciplines for -I/O operations. Any constructors for file, socket, pipe, or directory -handles found within the lexical scope of this pragma will use the -declared default. +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 +not influenced by this pragma. + +Only the two pseudo-disciplines ":raw" and ":crlf" are currently +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. -Handle constructors that are called with an explicit set of disciplines -are not influenced by the declared defaults. +=head1 UNIMPLEMENTED FUNCTIONALITY -The default disciplines so declared are available by the special -discipline name ":def", and can be used within handle constructors -that allow disciplines to be specified. This makes it possible to -stack new disciplines over the default ones. +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. + +In future, any default disciplines declared by this pragma will be +available by the special discipline name ":def", 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. open FH, "<:para :def", $file or die "can't open $file: $!"; +Socket and directory handles will also support disciplines in +future. + +Full support for I/O disciplines will enable all of the supported +disciplines to work on all platforms. + =head1 SEE ALSO -L<perlunicode>, L<perlfunc/"open"> +L<perlfunc/"binmode">, L<perlfunc/"open">, L<perlunicode> =cut - -1; |