summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/open.pm16
-rw-r--r--lib/open.t18
2 files changed, 28 insertions, 6 deletions
diff --git a/lib/open.pm b/lib/open.pm
index 1bfe0d6833..d3f2d1bac8 100644
--- a/lib/open.pm
+++ b/lib/open.pm
@@ -1,7 +1,7 @@
package open;
use warnings;
-our $VERSION = '1.08';
+our $VERSION = '1.09';
require 5.008001; # for PerlIO::get_layers()
@@ -95,16 +95,22 @@ sub import {
}
}
if ($type eq 'IN') {
- _drop_oldenc(*STDIN, @val);
+ _drop_oldenc(*STDIN, @val) if $std;
$in = join(' ', @val);
}
elsif ($type eq 'OUT') {
- _drop_oldenc(*STDOUT, @val);
+ if ($std) {
+ _drop_oldenc(*STDOUT, @val);
+ _drop_oldenc(*STDERR, @val);
+ }
$out = join(' ', @val);
}
elsif ($type eq 'IO') {
- _drop_oldenc(*STDIN, @val);
- _drop_oldenc(*STDOUT, @val);
+ if ($std) {
+ _drop_oldenc(*STDIN, @val);
+ _drop_oldenc(*STDOUT, @val);
+ _drop_oldenc(*STDERR, @val);
+ }
$in = $out = join(' ', @val);
}
else {
diff --git a/lib/open.t b/lib/open.t
index f9cacab8a1..586d8e2c38 100644
--- a/lib/open.t
+++ b/lib/open.t
@@ -7,7 +7,7 @@ BEGIN {
require './test.pl';
}
-plan 23;
+plan 24;
# open::import expects 'open' as its first argument, but it clashes with open()
sub import {
@@ -195,6 +195,22 @@ SKIP: {
"test for an endless loop in PerlIO_find_layer");
}
+is runperl(
+ progs => [
+ 'use open q\:encoding(UTF-8)\, q-:std-;',
+ 'use open q\:encoding(UTF-8)\;',
+ 'if(($_ = <STDIN>) eq qq-\x{100}\n-) { print qq-stdin ok\n- }',
+ 'else { print qq-got -, join(q q q, map ord, split//), "\n" }',
+ 'print STDOUT qq-\x{ff}\n-;',
+ 'print STDERR qq-\x{ff}\n-;',
+ ],
+ stdin => "\xc4\x80\n",
+ stderr => 1,
+ ),
+ "stdin ok\n\xc3\xbf\n\xc3\xbf\n",
+ "use open without :std does not affect standard handles",
+;
+
END {
1 while unlink "utf8";
1 while unlink "a";