您可以使用Scope::Guard 之类的东西 - 词法范围的资源管理,以确保它在您离开范围时被设置回:utf8
,无论如何(返回,死亡,无论如何):
#!/usr/bin/perl -w
use strict;
use Scope::Guard qw(guard);
binmode(STDOUT, ':utf8');
print(join(', ', PerlIO::get_layers(STDOUT)), "\n");
{
# When guard goes out of scope, this sub is guaranteed to be called:
my $guard = guard {
binmode(STDOUT, ':utf8');
};
binmode(STDOUT, ':raw');
print(join(', ', PerlIO::get_layers(STDOUT)), "\n");
}
print(join(', ', PerlIO::get_layers(STDOUT)), "\n");
或者,如果您不想包含像 Scope::Guard 这样的新依赖项(Scope::Guard 非常适合这种本地化......):
#!/usr/bin/perl -w
use strict;
binmode(STDOUT, ':utf8');
print(join(', ', PerlIO::get_layers(STDOUT)), "\n");
{
my $guard = PoorMansGuard->new(sub {
binmode(STDOUT, ':utf8');
});
binmode(STDOUT, ':raw');
print(join(', ', PerlIO::get_layers(STDOUT)), "\n");
}
print(join(', ', PerlIO::get_layers(STDOUT)), "\n");
package PoorMansGuard;
sub new {
my ($class, $sub) = @_;
bless { sub => $sub }, $class;
}
sub DESTROY {
my ($self) = @_;
$self->{sub}->();
}