Perl替换:无法使用变量perl regex替换

时间:2015-01-17 12:22:03

标签: regex perl substitution

以下代码逐行读取define.c文件,并将所有"#define"指令存储在散列中(使用定义名称及其替换文本)。然后,如果在连续的行上找到用法,它将替换它们。

如果正在使用"#define"指令,则替换存在问题。它将所有#defines正确存储在哈希中。

我是perl和regex的初学者,并且无法指出为什么它不起作用的愚蠢的事。
有帮助吗?

#!/usr/bin/perl -w

use strict;
my %definesHash;

open(FILE, "defines.c") || die "Cannot open $!\n";
open(OUT, ">defines.i") || die "Cannot open $!\n";


while (<FILE>)
{
 my $line = $_;
 if ($line =~ /#define\s+/)
 {
   $line =~ s/#define\s+//g;
   if ($line =~ /\b([\w]+)\b\s+/)
   {
    my $define = $1;
    $line =~ s/\b[\w]+\b\s+//;
    $definesHash{$define} = "";
    if($line =~ /\s*(.*)\s*/)
    {
      $definesHash{$define} = $1;
    }
   }
   print OUT $_;
 }
 else
 { 
   my($def, $replace);
   while (($def, $replace) = each(%definesHash))
   {
     print " $def => $replace \n";
     if ($line =~ /$def/)
     {
      $line =~ s/$def/$replace/g; #****** Some Problem Here, But What? ********
     }
   }
   print OUT $line;
 }
}

close(FILE);
close(OUT);

defines.c

#include <stdio.h>

#define VALUE 10
#define PLACE (20 + 0)
#define NUM (VALUE + 10)
int main()
{
  int num;
  num = NUM + 25 + NUM + PLACE;
  return 0;
}

Expected Output: **defines.i**

#include <stdio.h>

#define VALUE 10
#define PLACE (20 + 0)
#define NUM (VALUE + 10)
int main()
{
  int num;
  num = (10 + 10) + 25 + (10 + 10) + (20 + 0);
  // or
  num = (VALUE + 10) + 25 + (VALUE + 10) + (20 + 0);
  return 0;
}  

我知道问题在于替换,正如我在评论中指出的那样。我可以看到原始行在替换后变成乱码,而哈希中的内容似乎是正确的 它是否替换使用变量?

1 个答案:

答案 0 :(得分:1)

看起来你的脚本取决于哈希的顺序(或者更确切地说,无序)。

#define VALUE 10
#define NUM (VALUE + 10)

定义没有更新,因为替换发生在else - 因此替换只发生在没有#define的行上。

但是,您根据each提供的任何顺序执行替换 - 因此可能会尝试替换VALUE,然后然后尝试替换{{1} }。

我可能会在每个定义中执行初始替换,如下所示:

NUM

或者它可能是未转义的正则表达式元字符,此处由#!/usr/bin/perl use warnings; use strict; my %definesHash; open(my $fh_in, '<', "defines.c") || die "Cannot open $!\n"; open(my $fh_out, '>', "defines.i") || die "Cannot open $!\n"; while (<$fh_in>) { if (/^#define\s+(\w+)\s+(.*)\s*$/) { my ($define, $replacement) = ($1, $2); # perform existing replacements on # the current $replacement while (my ($def, $replace) = each %definesHash) { $replacement =~ s/$def/\Q$replace/g; } $definesHash{$define} = $replacement; } else { while (my ($def, $replace) = each(%definesHash)) { print " $def => $replace \n"; s/$def/$replace/g; } } print $fh_out $_; } close($fh_in); close($fh_out); 转义。