Perl循环替换文件中$pc_count$时fileb首值重复该如何解决?
问题原因
- 核心问题是替换操作直接修改了存储模板的
$line变量:第一次替换完成后,$line里的$pc_count$占位符就被替换成了第一个值,后续循环执行s/\$pc_count\$/$first/时,已经找不到匹配的占位符,因此$line不会再更新,所有输出都复用第一个替换结果。 - 次要问题:原有匹配
fileb行的正则要求末尾必须有空白字符,若fileb中部分行末尾没有空格/换行符会匹配失败,导致部分值无法正常读取。
修复后的代码
核心修改逻辑为:提前保存filea中的模板行,遍历fileb时每次都用原始模板做替换,不修改模板本身。
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 $template = ''; # 读取filea,直接输出无占位符的行,保存包含占位符的模板行 while (<IN_FILE>) { if ($_ =~ /\$pc_count\$/) { $template = $_; next; } print $_; } # 遍历fileb的每一行,基于模板生成替换后的内容 while (<IN_FILE1>) { chomp; # 移除行尾的换行、空白符 next if $_ eq ''; # 跳过空行 # 每次都使用原始模板生成新行,不修改模板本身 my $output_line = $template; $output_line =~ s/\$pc_count\$/$_/; print $output_line; } close IN_FILE; close IN_FILE1;
预期输出效果
case(pc) '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); .. .. endcase
内容的提问来源于stack exchange,提问作者Akheel
相关产品推荐
相关产品推荐

