Perl替换:无法使用变量Perl regex替换
下面的代码逐行读取defines.c文件,并将所有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
“#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);