方法1:
$C_HOME = "$ENV{EO_HOME}\\common\\";
print $C_HOME;
给出C:\ work \ System11R1 \ common \
即环境变量正在扩展。
方法2:
解析属性文件 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 \
的输出即环境变量没有扩展。
如何在第二种情况下确保环境变量得到扩展。
答案 0 :(得分:7)
问题在于:
$o{$1}=$2;
当然,perl在阅读时不会自动评估$2
。
如果需要,可以手动评估:
$o{$1}=eval($2);
但是从安全的角度来看,你必须确保它没问题。
答案 1 :(得分:3)
$o{C_HOME}
的值包含文字字符串$ENV{C_HOME}\common\
。要获得$ ENV-value评估,请使用eval
...
$C_HOME = eval $o{"C_HOME"};
我留给你找出为什么会失败,但是......
答案 2 :(得分:1)
必须评估表达式:
$C_HOME = eval($o{"C_HOME"});
答案 3 :(得分: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\