Linux上的Perl:更改子进程的区域设置

Linux上的Perl:更改子进程的区域设置,linux,perl,subprocess,locale,Linux,Perl,Subprocess,Locale,更改子流程(在Linux中)的区域设置的正确方法是什么 例如,运行时 perl -e 'use POSIX qw(setlocale); setlocale(POSIX::LC_ALL, "C"); open F, "locale|"; while (<F>) { print if /LC_MESS/ }; close F' perl-e'使用POSIXQW(setlocale);setlocale(POSIX::LC_ALL,“C”);打开

更改子流程(在Linux中)的区域设置的正确方法是什么

例如,运行时

perl -e 'use POSIX qw(setlocale); setlocale(POSIX::LC_ALL, "C"); open F, "locale|"; while (<F>) { print if /LC_MESS/ }; close F'
perl-e'使用POSIXQW(setlocale);setlocale(POSIX::LC_ALL,“C”);打开F,“locale |”;while(){print if/LC_MESS/};关闭F'
我得到了答案
LC\u MESSAGES=“ca\u ES.UTF-8”
,但我想获得
LC\u MESSAGES=“C”
。无论我尝试过什么,我似乎都无法改变它

注意:我知道如何做
LC_ALL=C perl…..
,但这不是我想做的,我需要更改perl脚本中的区域设置,这是他应得的荣誉

您可以使用
%ENV
设置代码以及后续子进程的环境。与所有全局变量一样,对于您的作用域和较小的作用域,只在本地临时更改这些变量是有意义的。这就是
local
所做的

我还将您的
open
更改为使用三个参数形式,因为这样更安全(即使您没有为文件名/命令使用变量),并且使用了词法文件句柄。词法句柄将在块末尾超出范围,并隐式关闭

使用严格;
使用警告;
使用POSIXQW(setlocale);
{
setlocale(POSIX::LC_ALL,“C”);
本地$ENV{LC_ALL}='C';
打开我的$fh、-|、'locale'或die$!;
而(){
打印if/LC\u MESS/
};
}

$ENV{LC_ALL}='C'可以完成这项工作。另请参阅@TEDLYNMO谢谢,这项工作就完成了。没想到。谢谢,它确实有用。另外,我在文档中找不到如何在从子流程打开管道时执行三参数表单,很高兴知道!