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

Reply via email to