【问题标题】:How do you run an external command in perl while controlling its locale?如何在控制语言环境的同时在 perl 中运行外部命令?
【发布时间】:2012-04-23 23:49:01
【问题描述】:

this question 相关,但更深入。我正在运行如下命令:

foreach $dir (@dirs) {
    $cnt = `svn st $dir | wc -l`;
    if($cnt > 0){
        $content .= "$dir\n";
        $mods++;
    }
}

但是该目录包含非 ASCII 文件,因此当区域设置不正确或未设置时会引发错误。

在perl中设置我需要的语言环境的正确方法是

setlocale(LC_CTYPE, 'en_US.UTF-8');

但是,这似乎不会影响 svn st 命令,因为当 perl 脚本未在具有正确语言环境设置的终端中运行时,仍然会发生语言环境错误。

【问题讨论】:

    标签: perl locale


    【解决方案1】:

    需要为外部命令设置环境变量:

    $cnt = `LC_CTYPE=en_US.UTF-8 svn st $dir | wc -l`;
    

    您还可以更改脚本的环境 (%ENV),这会更改任何子进程的环境:

    $ENV{LC_CTYPE} = 'en_US.UTF-8';
    

    【讨论】:

      【解决方案2】:

      通过操作%ENV 哈希为新进程设置环境。

      $ENV{LC_CTYPE} = 'en_US.UTF-8';
      $cnt = `svn ...`;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 1970-01-01
        • 2011-10-15
        • 1970-01-01
        • 1970-01-01
        • 2013-12-04
        • 2012-10-22
        相关资源
        最近更新 更多