以下代码逐行读取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;
}
我知道问题在于替换,正如我在评论中指出的那样。我可以看到原始行在替换后变成乱码,而哈希中的内容似乎是正确的 它是否替换使用变量?
答案 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);
转义。