Linux 上的 Perl:更改子进程的语言环境
Perl on Linux: change locale for subprocesses
更改子进程语言环境的正确方法是什么(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 脚本中的语言环境.
我正在接受 ,所以功劳归于他。
您可以使用 %ENV
为代码和后续子流程设置环境。与所有全局变量一样,只在本地临时更改这些变量对于您的范围和更小的范围是有意义的。这就是 local
所做的。
我还更改了您的 open
以使用三参数形式,因为这样更安全(即使您没有为 filename/command 使用变量),并使用了词法文件句柄。词法句柄将在块的末尾超出范围并且 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/
};
}
更改子进程语言环境的正确方法是什么(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 脚本中的语言环境.
我正在接受
您可以使用 %ENV
为代码和后续子流程设置环境。与所有全局变量一样,只在本地临时更改这些变量对于您的范围和更小的范围是有意义的。这就是 local
所做的。
我还更改了您的 open
以使用三参数形式,因为这样更安全(即使您没有为 filename/command 使用变量),并使用了词法文件句柄。词法句柄将在块的末尾超出范围并且 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/
};
}