1

方法一:

$C_HOME = "$ENV{EO_HOME}\\common\\";
print $C_HOME;

给出 C:\work\System11R1\common\

即环境变量正在扩展。

方法二:

解析具有 C_HOME = $ENV{EO_HOME}\common\ 的属性文件

while(<IN>) {
    if(m/(.*)\s+=\s+(.*)/)
    {
        $o{$1}=$2;
    }
}

$C_HOME = $o{"C_HOME"};
print $C_HOME;

这给出了 $ENV{EO_HOME}\common\ 的输出

即环境变量没有得到扩展。

如何确保环境变量在第二种情况下也得到扩展。

4

4 回答 4

7

问题在于:

    $o{$1}=$2;

当然 perl$2在读取时不会自动评估。

如果需要,您可以手动评估它:

    $o{$1}=eval($2);

但是从安全的角度来看,您必须确保它是可以的。

于 2012-07-24T12:58:40.357 回答
3

的值$o{C_HOME}包含文字字符串$ENV{C_HOME}\common\。要获得 $ENV-value eval-ed,请使用eval...

$C_HOME = eval $o{"C_HOME"};

我留给你找出为什么会失败,但是......

于 2012-07-24T12:59:59.733 回答
1

必须评估表达式:

$C_HOME = eval($o{"C_HOME"});
于 2012-07-24T12:56:22.617 回答
0

Perl 在类似双引号的代码字符串中扩展变量,而不是在data中。

您必须使用eval一个字符串来显式地在其中插入变量,但是这样做而不检查您传递的eval内容是危险的。

相反,查找您可能想要在字符串中插入的所有内容,并使用带有/ee修饰符的正则表达式替换来评估那些。

该程序在配置值中查找对%ENV散列元素的所有引用并替换它们。您可能希望在 Perl 允许的任何地方添加对空格的支持($ ENV { EO_HOME }编译得很好)。它还分配%ENV您需要删除的测试值。

use strict;
use warnings;

my %data;

%ENV = ( EO_HOME => 'C:\work\System11R1' );

while (<DATA>) {
    if ( my ($key, $val) = m/ (.*) \s+ = \s* (.*) /x ) {
        $val =~ s/ ( \$ENV \{ \w+ \} ) / $1 /gxee;
        $data{$key} = $val;
    }
}

print $data{C_HOME};


__DATA__
C_HOME = $ENV{EO_HOME}\common\

输出

C:\work\System11R1\common\
于 2012-07-24T16:48:30.073 回答