Следующий код считывает файл define.c по очереди и сохраняет все директивы "#define"
в хеше (с именем и заменяющим текстом). Затем он заменяет их, если поиск найден на последовательных строках.Perl Substitute: Невозможно заменить переменные perl regex
У меня есть проблема с заменой, если используется директива "#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;
}
Я знаю, что проблема заключается в замене, как я указал в комментарии. Я вижу, что исходная строка становится тарабарщиной после этой подстановки, тогда как содержимое хэша кажется правильным.
Используется ли переменная в замещении?
Можете ли вы привести пример и ожидаемые результаты. – Sobrique
Ваш скрипт отлично работает для меня. Я получаю ожидаемый результат. – Toto
Ваша программа дает ожидаемый результат и работает нормально. Где у вас проблема? Вы не можете получить ожидаемый результат? – Praveen