【问题标题】:Perl on Linux: change locale for subprocessesLinux 上的 Perl:更改子进程的语言环境
【发布时间】:2021-03-19 10:25:06
【问题描述】:

更改子进程区域设置的正确方法是什么(在 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{LC_ALL} = 'C'; 可以胜任。
  • @TedLyngmo 谢谢,这样就可以了。没想到。

标签: linux perl subprocess locale


【解决方案1】:

我正在接听Ted Lyngmo's comment,所以归功于他。

您可以使用%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/
    };
}

【讨论】:

  • 谢谢,它确实有效。另外,我在文档中找不到从子进程打开管道时如何执行三个 arg 形式,很高兴知道!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
相关资源
最近更新 更多