如何在控制其语言环境的同时在perl中运行外部命令?

时间:2012-04-23 15:38:59

标签: perl locale

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脚本未在具有正确语言环境设置的终端中运行时,仍会出现语言环境错误。

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:3)

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

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