2012-07-24 95 views
1

方法1:Perl的正则表达式的奇怪行为

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

给C:\工作\ System11R1 \ COMMON \

即环境变量是越来越扩大。

方法2:

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

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

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

这给出$ ENV {EO_HOME}的输出\共同\

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

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

+1

什么是'$ O',到底是什么?你在哪里初始化它(通过“我的” - 当然,你这样做是因为你**使用'strict'和'warnings'编译指示,右)?尝试使用'Data :: Dumper'来查看'$ o'包含的内容。 – 2012-07-24 12:53:16

回答

7

的问题是该行:因为它读取它

当然
$o{$1}=$2; 

一个Perl不会自动评估$2

如果你愿意,你可以手动评价它:

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

但你必须确保它是从安全角度考虑确定。

1

表达式计算:

$C_HOME = eval($o{"C_HOME"}); 
3

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

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

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

0

的Perl扩展在双变量类似报价的代码字符串,而不是数据

你必须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\