我的脚本开头有以下代码段:

#!/usr/bin/perl5 -w
use strict;
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");


在某些子例程中,当有其他编码(来自遥远的子例程)时,在接收西里尔字母或其他字符时,数据将无法正确显示。导致此问题的是“ binmode”。

我可以在本地“关闭” binmode utf8(仅用于子例程)吗?

我无法删除全局binmode设置,也无法更改远距离编码。

最佳答案

实现此目的的一种方法是“复制” STD句柄,将重复的文件句柄设置为使用:raw层,然后将其分配给STD句柄的本地版本。例如下面的代码

binmode(STDOUT, ':utf8');
print(join(', ', PerlIO::get_layers(STDOUT)), "\n");

{
    open(my $duped, '>&', STDOUT);
    # The ':raw' argument could also be omitted.
    binmode($duped, ':raw');
    local *STDOUT = $duped;
    print(join(', ', PerlIO::get_layers(STDOUT)), "\n");
    close($duped);
}

print(join(', ', PerlIO::get_layers(STDOUT)), "\n");


版画

unix, perlio, utf8
unix, perlio
unix, perlio, utf8


在我的系统上。

09-25 20:03