regex - Perl 正则表达式替换,环境变量评估

我正在尝试将 Perl 的正则表达式替换与评估一起使用,以帮助在 Clearcase -> Git 迁移期间使一些配置文件更加动态。 Clearcase 系统高度依赖于/vob/目录,但我们需要使其更加动态,以便我们的 Jenkins 构建愉快。我正在尝试减少在迁移时破坏 Clearcase 构建的可能性。

我有一个配置文件,它是一个每行一个路径的文本文件:

/vob/config/file1
/vob/config/file2
/vob/config/file3

这个配置对这些配置文件做了一些额外的事情。该“东西”的编排由 Perl 脚本管理。我想要一些可以在运行脚本时覆盖的环境变量(“VOB_FOO”)。

我是 Perl 的完全新手,所以我认为是使用 Perl 环境变量语法,对其执行正则表达式并在处理文件时在线评估替换结果。

我希望我的新配置文件在文件中有明确的 $ENV{'VOB_FOO'} 条目,因此该文件将变为:
$ENV{'VOB_FOO'}/config/file1   ->    /home/me/foo/config/file1
$ENV{'VOB_FOO'}/config/file2   ->    /home/me/foo/config/file2
$ENV{'VOB_FOO'}/config/file3   ->    /home/me/foo/config/file3

结果正则表达式替换+评估将变成 (if VOB_FOO=/home/me/foo) :
$ENV{'VOB_FOO'}/config/file1   ->    /home/me/foo/config/file1
$ENV{'VOB_FOO'}/config/file2   ->    /home/me/foo/config/file2
$ENV{'VOB_FOO'}/config/file3   ->    /home/me/foo/config/file3

我的正则表达式匹配得很好,看起来替换有效,但替换的评估部分无效,我可以在这里使用一些帮助。我得到了一场成功的比赛,但替换结果如下:
$ENV{'VOB_FOO'}/config/file1   ->    $ENV('VOB_FOO'}/config/file1
$ENV{'VOB_FOO'}/config/file2   ->    $ENV('VOB_FOO'}/config/file2
$ENV{'VOB_FOO'}/config/file3   ->    $ENV('VOB_FOO'}/config/file3

此评估是否有任何警告或我可以通过某种方式使其正常工作?这是我的代码:
## See if we need to substitute an environment variable (e.g., is there a $ENV{} anywhere?)
## s - substitute through regular expressions (s/foo/bar/e)
## e modifier evaluates replacement as perl statement

{
    use re 'debugcolor';

    # this is for debugging only - I want to substitute 
    # grab the $ENV('VOB') string from the file and substitute
    # I may have multiple environment variables that I have to 
    # contend with. 
    my $vob = $ENV{'VOB'};  
    print $vob; 
    print "\n";

    my $regexp = qr/(\$ENV\{[\'][\w]*[\']\})/;

    if( $second =~ m/$regexp/ )
    {
        print "Found the regexp; attempting substitution.\n";
        $second =~ s/$regexp/$1/e;  
    }
    else
    {
        print $regexp + "\n";
        print $second + "\n";
        print "Did not find the regexp\n";
    }
}

我也欢迎批评或建议更好的方法来做到这一点 - 在我努力实现这一点时,我并没有被这种方法或代码所束缚。

最佳答案

我想你只需要这个。它不是提取整个表达式,而是获取哈希键并将其用于真正的 %ENV
我添加了一个替代项,以便可以使用或不使用引号来编写散列键,并且可以有前导或尾随空格

$second =~ s/\$ENV\{\s*(?|(\w+)|'(\w+)')\s*\}/$ENV{$1}/g