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/
    };
}