Perl中"$!"符合条件时返回UTF-8的规则及使用示例咨询
Perl 5.22+ 错误变量
$!/$^E UTF-8 特性使用示例 特性基础说明
Perl 5.22及以上版本中,$!(系统标准错误变量)和$^E(操作系统扩展错误变量)的字符串化结果如果是非ASCII的UTF-8内容,会自动带上UTF-8标志位,支持区域感知的程序无需额外编码转换就能正确输出用户母语的错误提示。
如果需要保留5.20及更早版本的行为(不自动添加UTF-8标志位),可以在同时开启use bytes和use locale ":messages"的作用域内对这两个变量做字符串化操作,该配置只会影响这两个变量的字符串化逻辑,不会干扰其他Perl操作。
示例1:默认特性使用(适配多语言错误输出)
该示例可在系统区域设置为非英语(如中文、德语)的环境中,正确输出本地化的错误信息,不会出现乱码:
use v5.22; use strict; use warnings; use utf8; # 配置标准输出为UTF-8编码 binmode STDOUT, ':encoding(UTF-8)'; # 触发系统错误:打开不存在的文件 open my $fh, '<', '不存在的测试文件.txt' or do { # 直接输出$!即可得到正确编码的本地化错误提示 print "打开文件失败:$!\n"; };
在中文区域的Unix-like系统中运行上述代码,会输出类似打开文件失败:没有那个文件或目录的正确中文提示,无乱码问题。
示例2:兼容旧版本行为的写法
如果代码需要同时兼容5.20及更早版本,或者需要拿到不带UTF-8标志位的原始错误字节串,可使用如下写法:
use v5.10; use strict; use warnings; # 触发系统错误 open my $fh, '<', '不存在的测试文件.txt' or do { my $err_msg; # 仅在这个小作用域内开启兼容配置,不影响作用域外的其他逻辑 { use bytes; use locale ':messages'; $err_msg = "$!"; } # 此处拿到的$err_msg和5.20及更早版本表现完全一致,为不带UTF-8标志位的原始字节串 # 可按旧代码逻辑对$err_msg做后续编码处理 print "错误信息(旧版本兼容格式):$err_msg\n"; };
内容的提问来源于stack exchange,提问作者Akeno
相关产品推荐
相关产品推荐

