2011-01-14 16 views
6

binmodeを使用している場合、以前に使用されていたbinmodeからレイヤーをポップする必要がありますか?各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 

答えて

2

:popは、:encoding(...)として層をポップする必要があります。したがって、実際のレイヤーを別のレイヤーに置き換える場合は、:popにする必要があります。

しかし、:rawを押すと実際に一連のポップアップが表示されます。また、:perlioは自動的に:unixを下に挿入します。したがって、ポップの正確な数は実際に現在のレイヤーに依存します。 documentationとして

は、自分自身を言う:

よりエレガント(かつ安全)インターフェースが必要とされています。

関連する問題