首页 > 解决方案 > 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 脚本中的语言环境

标签: linuxperlsubprocesslocale

解决方案


我正在接受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/
    };
}

推荐阅读