【问题标题】:Perl regex strange behaviourPerl 正则表达式奇怪的行为
【发布时间】:2012-07-25 00:54:53
【问题描述】:

方法一:

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

给 C:\work\System11R1\common\

ie 环境变量正在扩展。

方法二:

解析属性文件有 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\

的输出

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

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

【问题讨论】:

  • $o 到底是什么?你在哪里初始化它(通过my——当然,你这样做是因为你正在使用strictwarnings编译指示,对吧)?尝试使用Data::Dumper 查看$o 包含的内容。

标签: regex perl


【解决方案1】:

问题出在一行:

    $o{$1}=$2;

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      表达式必须被计算:

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

      【讨论】:

        【解决方案4】:

        Perl 在类似双引号的 code 字符串中扩展变量,而不是在 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\
        

        【讨论】:

          猜你喜欢
          • 2018-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-17
          • 2013-07-13
          • 2012-03-02
          • 1970-01-01
          相关资源
          最近更新 更多