linux - Linux 上的 Perl:更改子进程的语言环境
问题描述
更改子进程的语言环境(在 Linux 中)的正确方法是什么?
例如,运行时
perl -e 'use POSIX qw(setlocale); setlocale(POSIX::LC_ALL, "C"); open F, "locale|"; while (<F>) { print if /LC_MESS/ }; close F'
我得到了答案LC_MESSAGES="ca_ES.UTF-8"
,但我想获得LC_MESSAGES="C"
. 无论我尝试过什么,我似乎都无法改变它。
注意:我知道这样做LC_ALL=C perl .....
,但这不是我想做的,我需要更改 Perl 脚本中的语言环境。
解决方案
我正在接受Ted Lyngmo 的评论,所以感谢他。
您可以使用 为您的代码以及后续子流程设置环境%ENV
。与所有全局变量一样,仅针对您的范围和较小的范围在本地临时更改这些变量是有意义的。就是local
这样。
我还更改了您open
以使用三参数形式,因为这样更安全(即使您没有使用文件名/命令的变量),并使用了词法文件句柄。词法句柄将在块的末尾close
隐式地超出范围。
use strict;
use warnings;
use POSIX qw(setlocale);
{
setlocale(POSIX::LC_ALL, "C");
local $ENV{LC_ALL} = 'C';
open my $fh, '-|', 'locale' or die $!;
while (<$fh>) {
print if /LC_MESS/
};
}
推荐阅读
- javascript - 如何在不包含父目录的情况下创建 tar 存档
- generics - Kotlin 绑定类型参数扩展重载
- authentication - 使用自签名证书的设备身份验证
- reactjs - React Native TypeError:React.createClass 不是函数
- opc-ua - BadSessionNotActivated,0x80270000,会话无法使用,因为没有调用ActivateSession
- android - Android - 工具栏下方显示的内容
- sql-server - Excel 查询不会更新
- php - 用于读取-修改-写入的 PHP 群()不起作用
- reactjs - 与 TypeScript 反应:类型“{}”不可分配给类型
- javascript - 浮动在页面上并用作锚点的按钮