我有两个输入文件:
filea
和fileb
。在 filea
中,我有一个字符串 $pc_count$
,其中 fileb
中,有数字和字符串。我必须在 fileb
中搜索数字并替换 $pc_count$
中的 filea
。
我已经尝试过下面的代码,但是
fileb
的第一个值每次都会重复($pc_count$
)。
open (IN_FILE, "<filea") or die "Please provide an correct file path\n";
open (IN_FILE1, "<fileb") or die "Please provide an correct file path\n";
my $i = 0;
while (<IN_FILE>) {
if($_ =~ /\$pc_count\$/) {
my $line = $_;
while (<IN_FILE1>) {
if($_ =~ /([a-z0-9-]+)[\s]+/) {
my $first = $1;
$line =~ s/\$pc_count\$/$first/;
#print OUT_FILE("$line");
print $line;
}
}
}
#print OUT_FILE("$_");
}
close IN_FILE;
close IN_FILE1;
文件a
case(pc)
'h$pc_count$ : $display("checkdata string %s ",pc_string);
endcase
文件b
fe0000
fe0001
fe0002
fe0003
..
..
..
结果:
case(pc)
'hfe000 : $display("checkdata string %s ",pc_string);
'hfe000 : $display("checkdata string %s ",pc_string);
'hfe000 : $display("checkdata string %s ",pc_string);
'hfe000 : $display("checkdata string %s ",pc_string);
..
..
..
..
endcase
[我必须修复代码中的语法错误才能运行它。请确保您向我们提供可运行的代码。]
问题在于
$line
中存储的内容。
您迭代
IN_FILE
文件句柄,直到找到包含 $pc_count$
的行。然后将该行复制到 $line
并进入内部处理循环。
所以第一次循环你的内循环时,
$line
包含:
'h$pc_count$ : $display("checkdata string %s ",pc_string);
几行之后,您可以使用以下代码更改
$line
:
$line =~ s/\$pc_count\$/$first/;
所以
$line
现在包含:
'hfe000 : $display("checkdata string %s ",pc_string);
下次循环时,您将从
$line
开始,其中包含以 hfe000
开头的字符串。因此,当您尝试第二次运行替换时,不会发生任何变化,因为 $line
不再包含 $pc_count$
。
最简单的修复可能是根本不更改
$line
,而是直接打印替换的输出(并使用 /r
,这样原始字符串就不会改变)。
if($_ =~ /([a-z0-9-]+)[\s]+/) {
my $first = $1;
print $line =~ s/\$pc_count\$/$first/r;
}
产生:
'hfe0000 : $display("checkdata string %s ",pc_string);
'hfe0001 : $display("checkdata string %s ",pc_string);
'hfe0002 : $display("checkdata string %s ",pc_string);
'hfe0003 : $display("checkdata string %s ",pc_string);
第一次替换后,
$line
发生更改,并且不再包含字符串$pc_count$
。 解决此问题的一种方法是将原始行的副本保留在另一个变量中 ($line2
):
use warnings;
use strict;
open (IN_FILE, "<filea") or die "Please provide an correct file path\n";
open (IN_FILE1, "<fileb") or die "Please provide an correct file path\n";
my $i = 0;
while (<IN_FILE>) {
if ($_ =~ /\$pc_count\$/) {
my $line = $_;
while (<IN_FILE1>) {
my $line2 = $line;
if ($_ =~ /([a-z0-9-]+)[\s]+/) {
my $first = $1;
$line2 =~ s/\$pc_count\$/$first/;
print $line2;
}
}
}
#print OUT_FILE("$_");
}
close IN_FILE;
close IN_FILE1;
输出:
'hfe0000 : $display("checkdata string %s ",pc_string);
'hfe0001 : $display("checkdata string %s ",pc_string);
'hfe0002 : $display("checkdata string %s ",pc_string);
'hfe0003 : $display("checkdata string %s ",pc_string);