2011-01-14 14 views
6

Al usar binmode, ¿debo extraer las capas de un posible binmode utilizado anteriormente?¿Debo hacer pop después de cada binmode?

#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use autodie; 

open my $tty, '>:encoding(utf8)', '/dev/tty'; # ... 
close $tty; 
open $tty, '>:encoding(latin1)', '/dev/tty'; # ... 
close $tty; 
open $tty, '>:encoding(utf8)', '/dev/tty'; # ... 
close $tty; 
open $tty, '>:encoding(latin1)', '/dev/tty'; # ... 
close $tty; 

open $tty, '>:bytes', '/dev/tty'; 
say "@{[ PerlIO::get_layers($tty) ]}"; # unix perlio 
close $tty; 

say "----------------------------------------"; 

binmode STDOUT, ':encoding(utf8)'; # ... 
binmode STDOUT, ':encoding(latin1)'; # ... 
binmode STDOUT, ':encoding(utf8)'; # ... 
binmode STDOUT, ':encoding(latin1)'; # ... 

binmode STDOUT, ':bytes'; 
say "@{[ PerlIO::get_layers(*STDOUT) ]}"; # unix perlio encoding(utf8)/
# utf8 encoding(iso-8859-1) utf8 encoding(utf8) utf8 encoding(iso-8859-1) 


binmode STDOUT, ':pop:pop:pop:pop:bytes'; 
say "@{[ PerlIO::get_layers(*STDOUT) ]}"; # unix perlio 

.

#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use autodie; 

open my $tty, '>:encoding(utf8)', '/dev/tty'; # ... 
close $tty; 

open $tty, '>:raw', '/dev/tty'; 
say "@{[ PerlIO::get_layers($tty) ]}"; # unix 
close $tty; 

say "----------------------------------------"; 

binmode STDOUT, ':encoding(utf8)'; # ... 

binmode STDOUT, ':raw'; 
say "@{[ PerlIO::get_layers(*STDOUT) ]}"; # unix perlio 

binmode STDOUT, ':pop:raw'; 
say "@{[ PerlIO::get_layers(*STDOUT) ]}"; # unix 

Respuesta

2

:pop se requiere para hacer estallar reales capas, como :encoding(...). Entonces sí, si quieres reemplazar una capa real por otra, entonces tendrás que :pop.

Pero tenga en cuenta que empujar :raw en realidad resulta en una serie de pop ... Y :perlio inserta automáticamente :unix debajo. Entonces, el número exacto de pops realmente depende de las capas actuales.

A medida que el documentation dice sí: se necesita

Una interfaz más elegante (y más seguro).

Cuestiones relacionadas