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

Perl替换:无法使用变量Perl regex替换,regex,perl,substitution,Regex,Perl,Substitution,下面的代码逐行读取defines.c文件,并将所有“#define”指令存储在一个散列中(带有defines名称及其替换文本)。然后,如果在连续行中找到用法,它将替换它们 如果使用了“#define”指令,我对替换有问题。它将所有的#定义正确地存储在散列中 我是perl和regex的初学者,无法指出为什么它不工作的愚蠢之处。 有什么帮助吗 #!/usr/bin/perl -w use strict; my %definesHash; open(FILE, "defines.c") || di

下面的代码逐行读取defines.c文件,并将所有
“#define”
指令存储在一个散列中(带有defines名称及其替换文本)。然后,如果在连续行中找到用法,它将替换它们

如果使用了
“#define”
指令,我对替换有问题。它将所有的
#定义
正确地存储在散列中

我是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);
正如我在评论中指出的,我知道问题在于替换。我可以看到原始行在替换后变得乱七八糟,而散列中的内容似乎是正确的。

是否使用了替换变量?

看起来您的脚本取决于散列的顺序(或者更确切地说,无序)

#define VALUE 10
#define NUM (VALUE + 10)
定义没有更新,因为替换发生在
else
中,因此替换只发生在没有
的行上

但是,您可以根据
每个
给您的顺序执行替换,因此它可能会尝试替换
,然后尝试替换
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);
#/usr/bin/perl
使用警告;
严格使用;
我的%definesHash;
打开(我的$fh_in,,“defines.i”)| | die“无法打开$!\n”;
而(){
如果(/^#定义\s+(\w+)\s+(.*)\s*$/){
我的($define,$replacement)=($1,$2);
#在上执行现有替换
#目前的美元替代品
while(my($def,$replace)=每个%definesHash){
$replacement=~s/$def/\Q$replacement/g;
}
$definesHash{$define}=$replacement;
}
否则{
而(my($def,$replace)=每个(%definesHash)){
打印“$def=>$replace\n”;
s/$def/$replace/g;
}
}
打印$fh\u out$;
}
收盘价($fh_in);
收盘价($fh_out);

或者它可能是未转义的regex元字符,这里由
\Q

转义。您能给出示例和预期的输出吗?您的脚本对我来说很好。我得到了预期的结果。你的程序给出了预期的输出,运行良好。你哪里有问题?您是否无法获得预期的输出?问题在于regex(替换)也获取了新行。在替换过程中,这是导致问题的原因,每次替换都会将后续输出移动到新行。我现在已经修好了,现在可以用了。谢谢你的时间。我知道要取消散列的顺序。这完全不能产生预期的输出。我能解决这个问题。顺便说一句,谢谢你简洁的代码。问题出在哪里?我已经把它放在问题下面的评论里了。请看那边。我认为这个问题现在还没有定论,如果你不介意的话,我想删除这个。那当然可以。
#define VALUE 10
#define NUM (VALUE + 10)
#!/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);