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