my $locale_encoding;
-sub in_locale { $^H & $locale::hint_bits }
+sub in_locale { $^H & ($locale::hint_bits || 0)}
sub _get_locale_encoding {
unless (defined $locale_encoding) {
sub import {
my ($class,@args) = @_;
croak("`use open' needs explicit list of disciplines") unless @args;
+ my $std;
$^H |= $open::hint_bits;
my ($in,$out) = split(/\0/,(${^OPEN} || "\0"), -1);
while (@args) {
if ($type =~ /^:?(utf8|locale|encoding\(.+\))$/) {
$type = 'IO';
$dscp = ":$1";
+ } elsif ($type eq ':std') {
+ $std = 1;
+ next;
} else {
$dscp = shift(@args) || '';
}
} else {
$layer = "encoding($locale_encoding)";
}
+ $std = 1;
} else {
unless(PerlIO::Layer::->find($layer)) {
carp("Unknown discipline layer '$layer'");
$^H{"open_$type"} = $layer;
}
}
- # print "# type = $type, val = @val\n";
if ($type eq 'IN') {
$in = join(' ',@val);
}
}
}
${^OPEN} = join("\0",$in,$out) if $in or $out;
+ if ($std) {
+ if ($in) {
+ if ($in =~ /:utf8\b/) {
+ binmode(STDIN, ":utf8");
+ } elsif ($in =~ /(\w+\(.+\))/) {
+ binmode(STDIN, ":$1");
+ }
+ }
+ if ($out) {
+ if ($out =~ /:utf8\b/) {
+ binmode(STDOUT, ":utf8");
+ binmode(STDERR, ":utf8");
+ } elsif ($out =~ /(\w+\(.+\))/) {
+ binmode(STDOUT, ":$1");
+ binmode(STDERR, ":$1");
+ }
+ }
+ }
}
1;
use open ':locale';
use open ':encoding(iso-8859-7)';
+ use open ':std';
+
=head1 DESCRIPTION
Full-fledged support for I/O disciplines is now implemented provided
When open() is given an explicit list of layers they are appended to
the list declared using this pragma.
+The C<:std> subpragma on its own has no effect, but if combined with
+the C<:utf8> or C<:encoding> subpragmas, it converts the standard
+filehandles (STDIN, STDOUT, STDERR) to comply with encoding selected
+for input/output handles. For example, if both input and out are
+chosen to be C<:utf8>, a C<:std> will mean that STDIN, STDOUT, and
+STDERR are also in C<:utf8>. On the other hand, if only output is
+chosen to be in C<:encoding(koi8r)', a C<:std> will cause only the
+STDOUT and STDERR to be in C<koi8r>. The C<:locale> subpragma
+implicitly turns on C<:std>.
+
The logic of C<:locale> is as follows:
=over 4