Perl正则表达式奇怪的行为

时间:2012-07-24 12:47:53

标签: regex perl

方法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 \

的输出

即环境变量没有扩展。

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

4 个答案:

答案 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\