2011-01-14 30 views
6

Khi sử dụng binmode, tôi có nên bật các lớp từ một binmode có thể sử dụng trước đó không?Tôi có nên bật sau mỗi binmode không?

#!/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 

Trả lời

2

:pop được yêu cầu phải bật thực lớp, chẳng hạn như :encoding(...). Vì vậy, có, nếu bạn muốn thay thế một lớp thực tế bằng một lớp khác, thì bạn sẽ phải :pop.

Nhưng lưu ý rằng việc đẩy :raw thực sự dẫn đến một chuỗi cửa sổ bật lên ... Và :perlio sẽ tự động chèn :unix bên dưới. Vì vậy, số lượng chính xác của bật thực sự phụ thuộc vào các lớp hiện tại.

Khi documentation nói bản thân:

Một giao diện thanh lịch hơn (và an toàn hơn) là cần thiết.

Các vấn đề liên quan