Am 29.01.2010 um 17:28 schrieb Nicholas Clark:
On Fri, Jan 29, 2010 at 02:22:06PM +0100, Michael Ludwig wrote:
Filehandles may have IO layers applied to them, like :utf8 or :raw.
One of the ways to achieve that is to use the binmode() function.
binmode $fh, ':utf8';
What I want to achieve is to set the STDOUT filehandle to ':raw' and
then to restore the previous IO layers.
Is there a way to determine the IO layers applying to a filehandle
just from the filehandle itself?
I think you want PerlIO::get_layers($fh)
I'm not sure where it's documented.
Thanks, just what I was looking for! It's documented in PerlIO(3pm).
It appears you can use that information to restore a filehandle
configuration:
# Gut: STDOUT duplizieren und Duplikat umstellen.
# STDOUT (global) wird nicht verstellt.
sub out_bin_good {
open my $fh, '>&STDOUT' or die "dup STDOUT: $!";
binmode $fh, ':raw' or die "binmode: $!";
print $fh "BINÄR 3\t", @_;
print STDERR "* layer: $_\n" for PerlIO::get_layers( $fh );
}
# Auch gut: IO-Modus sichern und wiederherstellen.
sub out_bin_also_good {
my @layers = PerlIO::get_layers( STDOUT );
binmode STDOUT, ':raw' or die "binmode: $!";
print "BINÄR 4\t", @_;
print STDERR "* layer: $_\n" for PerlIO::get_layers( STDOUT );
my $layers = join '', map ":$_", @layers;
binmode STDOUT, $layers;
print STDERR "reset STDOUT to $layers\n";
print STDERR "* layer: $_\n" for PerlIO::get_layers( STDOUT );
}
--
Michael.Ludwig (#) XING.com